大神论坛

找回密码
快速注册
查看: 96 | 回复: 0

[原创] 驱动开发之逆向分析某软件WFP防火墙

主题

帖子

0

积分

初入江湖

UID
683
积分
0
精华
威望
0 点
违规
大神币
68 枚
注册时间
2023-10-14 10:55
发表于 2023-12-30 23:11
本帖最后由 kangdiwu 于 2023-12-30 23:11 编辑

前言

最近朋友找我帮忙,起因是他们公司有一个VPN软件,只有使用这软件才能正常访问公司内网站。
这个软件需要账号登录,一个账号只能在一个设备登录,另一个设备登录就会被挤下线。
因为他有几台电脑,所以需要一个账号能几个设备一起使用。

尝试

因为对网络方面不太了解,所以最先想到是在一台电脑(后面称为主机)建http代理,其它电脑(后面称为客机)通过代理在访问网站。
主机使用CCProxy 设置HTTP 端口

客机通过proxifier设置代理地址和端口。


上面设置好后,在VPN软件没有运行时,代理能正常通过,CCProxy能正常显示用户,但是VPN软件驱动后 代理就生效,CCProxy 没有流量通过。

寻找原因

没有流量通过,可能是路由,防火墙和系统原因。但是防火墙两边都关了,所以只能先用wireshark抓包看看。
wireshark里面可以看到只有客机向主机重复发送TCP第一个握手的SYN,而主机没有发向客机的数据包,所以不可能是路由,应该是系统做了手脚。
pchunter 可以观察到启动VPN软件前后有一个驱动被加载。

驱动分析

把驱动直接拖到ida里面,因为没有壳,直接看导入函数,可以初步判断应该是用wfp搞的防火墙,拦截了局域网内其它电脑的数据包。

使用Windows-Kernel-Explorer工具可以查看所有wfp注册的callout,在启动vpn软件后会多出几个回调函数,而图中的OutBound 显然就是驱动管理出站的回调。

根据回调地址,在ida中定位到函数:


可以看到函数主要由HandleIPv4来决定最后的actionType 是将数据包放行或阻止。filter->context 指向DeviceObject->DeviceExtension 用来存放防火墙的出入站规则和行为。

进入HandleIPv4函数,根据返回值跟着可以找到过滤局域网数据判断的关键位置:

sub_1400065C4负责对传入IP跟驱动定义的防火墙规则匹配,根据返回的operator来决定是阻止数据,放行等,进入sub_1400065C4 函数后第一行是

a1 是之前的DeviceExtensiona3是传进来的对应TCP ,其它协议UDP等对应不同值。

0x1D018i64* a3 + a1 + 0x48对应的是TCP防火墙规则。
sub_1400041F0函数作用就是将sub_1400041F0所有防火墙规则拷贝到v14 这个数组里面。
而接下来的代码就是通过遍历v14数组将IP和防火墙规则匹配了,

之后只需要通过MatchFilter函数查看v14 结构偏移就可以得到每条防火墙规则的结构。ce lua脚本遍历

在最后输出结果可以有下面这一行




结尾


ce中将上面那条规则对应的operator改成1后,局域网代理就能正常访问了。
之后就是写驱动,或者看防火墙规则在3环怎么储存来修改了。

因为是公司的软件所以样品就不好发了。。。。。


注:若转载请注明大神论坛来源(本贴地址)与作者信息。

返回顶部