首页
社区
课程
招聘
[原创]afd内核过滤增强fiddler
发表于: 2019-6-18 19:36 13061

[原创]afd内核过滤增强fiddler

2019-6-18 19:36
13061

1.

写点笔记,怕忘了。
这种方式并不能处理https,只能处理http。 
 
Fiddler
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。
afd驱动
简来说AFD驱动向上与SOCKET应用接口约定了接口来实现SOCKET,AFD驱动实际上是一个TDI客户端,它通过TDI接口调用微软件的另一个网络部件TCPIP驱动来完成功能。AFD并没有官方的资料说明它的接口,但是在网上还是可以找到很关于AFD驱动的资料的。这里笔者参考了ReactOS-0.3.4-REL-src源代码中的AFD的内容,它于官方的AFD驱动实现还是有一些驱动别的,比如未实现FASTIO接口等。
为什么要增强,Fiddler对于浏览器的HTTP请求大部分是可以处理的,可是碰到类似自带一个libcef的客户端,或者直接用wininet来发送请求等不走ie代理的,Fiddler是抓不到其请求的,所以需要对其魔改一下。

(这样访问网络,fiddler并不能抓到)

2.简述
r3中winsock的connect,send,recv等等最终会转换成对afd驱动的DeviceControl(很多去广告喜欢挂钩这里)。

我们在驱动里面稍微打印一下相关的控制码(win2k源码中可以找到对应信息)
Fiddler
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。
afd驱动
简来说AFD驱动向上与SOCKET应用接口约定了接口来实现SOCKET,AFD驱动实际上是一个TDI客户端,它通过TDI接口调用微软件的另一个网络部件TCPIP驱动来完成功能。AFD并没有官方的资料说明它的接口,但是在网上还是可以找到很关于AFD驱动的资料的。这里笔者参考了ReactOS-0.3.4-REL-src源代码中的AFD的内容,它于官方的AFD驱动实现还是有一些驱动别的,比如未实现FASTIO接口等。
为什么要增强,Fiddler对于浏览器的HTTP请求大部分是可以处理的,可是碰到类似自带一个libcef的客户端,或者直接用wininet来发送请求等不走ie代理的,Fiddler是抓不到其请求的,所以需要对其魔改一下。
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。
afd驱动
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。
afd驱动
简来说AFD驱动向上与SOCKET应用接口约定了接口来实现SOCKET,AFD驱动实际上是一个TDI客户端,它通过TDI接口调用微软件的另一个网络部件TCPIP驱动来完成功能。AFD并没有官方的资料说明它的接口,但是在网上还是可以找到很关于AFD驱动的资料的。这里笔者参考了ReactOS-0.3.4-REL-src源代码中的AFD的内容,它于官方的AFD驱动实现还是有一些驱动别的,比如未实现FASTIO接口等。
为什么要增强,Fiddler对于浏览器的HTTP请求大部分是可以处理的,可是碰到类似自带一个libcef的客户端,或者直接用wininet来发送请求等不走ie代理的,Fiddler是抓不到其请求的,所以需要对其魔改一下。
简来说AFD驱动向上与SOCKET应用接口约定了接口来实现SOCKET,AFD驱动实际上是一个TDI客户端,它通过TDI接口调用微软件的另一个网络部件TCPIP驱动来完成功能。AFD并没有官方的资料说明它的接口,但是在网上还是可以找到很关于AFD驱动的资料的。这里笔者参考了ReactOS-0.3.4-REL-src源代码中的AFD的内容,它于官方的AFD驱动实现还是有一些驱动别的,比如未实现FASTIO接口等。
为什么要增强,Fiddler对于浏览器的HTTP请求大部分是可以处理的,可是碰到类似自带一个libcef的客户端,或者直接用wininet来发送请求等不走ie代理的,Fiddler是抓不到其请求的,所以需要对其魔改一下。

(这样访问网络,fiddler并不能抓到)

2.简述
r3中winsock的connect,send,recv等等最终会转换成对afd驱动的DeviceControl(很多去广告喜欢挂钩这里)。

我们在驱动里面稍微打印一下相关的控制码(win2k源码中可以找到对应信息)

得到结果
IOCTL_AFD_BIND:12003 
IOCTL_AFD_CONNECT:12007 
IOCTL_AFD_START_LISTEN:1200b 
IOCTL_AFD_WAIT_FOR_LISTEN:1200c 
IOCTL_AFD_ACCEPT:12010 
IOCTL_AFD_RECV:12017 
IOCTL_AFD_RECV_DATAGRAM:1201b 
IOCTL_AFD_SEND:1201f 
IOCTL_AFD_SEND_DATAGRAM:12023 
IOCTL_AFD_SELECT:12024 
IOCTL_AFD_DISCONNECT:1202b 
IOCTL_AFD_GET_SOCK_NAME:1202f 
IOCTL_AFD_GET_PEER_NAME:12033 
IOCTL_AFD_GET_TDI_HANDLES:12037 
IOCTL_AFD_SET_INFO:1203b 
IOCTL_AFD_GET_CONTEXT_SIZE:1203f 
IOCTL_AFD_GET_CONTEXT:12043 
IOCTL_AFD_SET_CONTEXT:12047 
IOCTL_AFD_SET_CONNECT_DATA:1204b 
IOCTL_AFD_SET_CONNECT_OPTIONS:1204f 
IOCTL_AFD_SET_DISCONNECT_DATA:12053 
IOCTL_AFD_SET_DISCONNECT_OPTIONS:12057 
IOCTL_AFD_GET_CONNECT_DATA:1205b 
IOCTL_AFD_GET_CONNECT_OPTIONS:1205f 
IOCTL_AFD_GET_DISCONNECT_DATA:12063 
IOCTL_AFD_GET_DISCONNECT_OPTIONS:12067 
IOCTL_AFD_SET_CONNECT_DATA_SIZE:1206b 
IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE:1206f 
IOCTL_AFD_SET_DISCONNECT_DATA_SIZE:12073 
IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE:12077 
IOCTL_AFD_GET_INFO:1207b 
IOCTL_AFD_EVENT_SELECT:12087 
IOCTL_AFD_DEFER_ACCEPT:1208f 
IOCTL_AFD_GET_PENDING_CONNECT_DATA:120a7 
IOCTL_AFD_ENUM_NETWORK_EVENTS:1208b 
IOCTL_AFD_VALIDATE_GROUP:120ab 

IOCTL_AFD_BIND:12003 
IOCTL_AFD_CONNECT:12007 
IOCTL_AFD_START_LISTEN:1200b 
IOCTL_AFD_WAIT_FOR_LISTEN:1200c 
IOCTL_AFD_ACCEPT:12010 
IOCTL_AFD_RECV:12017 
IOCTL_AFD_RECV_DATAGRAM:1201b 
IOCTL_AFD_SEND:1201f 
IOCTL_AFD_SEND_DATAGRAM:12023 
IOCTL_AFD_SELECT:12024 
IOCTL_AFD_DISCONNECT:1202b 
IOCTL_AFD_GET_SOCK_NAME:1202f 
IOCTL_AFD_GET_PEER_NAME:12033 
IOCTL_AFD_GET_TDI_HANDLES:12037 
IOCTL_AFD_SET_INFO:1203b 
IOCTL_AFD_GET_CONTEXT_SIZE:1203f 
IOCTL_AFD_GET_CONTEXT:12043 
IOCTL_AFD_SET_CONTEXT:12047 
IOCTL_AFD_SET_CONNECT_DATA:1204b 
IOCTL_AFD_SET_CONNECT_OPTIONS:1204f 
IOCTL_AFD_SET_DISCONNECT_DATA:12053 
IOCTL_AFD_SET_DISCONNECT_OPTIONS:12057 
IOCTL_AFD_GET_CONNECT_DATA:1205b 
IOCTL_AFD_GET_CONNECT_OPTIONS:1205f 
IOCTL_AFD_GET_DISCONNECT_DATA:12063 
IOCTL_AFD_GET_DISCONNECT_OPTIONS:12067 
IOCTL_AFD_SET_CONNECT_DATA_SIZE:1206b 
IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE:1206f 
IOCTL_AFD_SET_DISCONNECT_DATA_SIZE:12073 
IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE:12077 
IOCTL_AFD_GET_INFO:1207b 
IOCTL_AFD_EVENT_SELECT:12087 
IOCTL_AFD_DEFER_ACCEPT:1208f 
IOCTL_AFD_GET_PENDING_CONNECT_DATA:120a7 
IOCTL_AFD_ENUM_NETWORK_EVENTS:1208b 
IOCTL_AFD_VALIDATE_GROUP:120ab 

在r3程序调用ZwDeviceIoControlFile的时候,实际会有2条路径,一个是afd驱动对象的>MajorFunction[IRP_MJ_DEVICE_CONTROL],
还一个就是其FastIoDispatch->FastIoDeviceControl。我们需要把这2个都挂钩,。

打印一下我们的wininet程序访问网页的时候对应的iocontrol

可以看到 IRP_MJ_DEVICE_CONTROL中,收到了一个120C7的请求,其中包含了00 50 (80端口) 77 60 c8 a6 (ip)。但是这个io码并没有在上面的列表,我们姑且叫它
constexpr auto AFD_X32_CONNECT = 0x120c7;
我们知道,Fiddler作为代理的时候,程序发送的内容和Fiddler转发的内容是一致的,所以我们可以直接修改connect时的ip和端口,再由Fiddler转发即可。
constexpr auto AFD_X32_CONNECT = 0x120c7;
我们知道,Fiddler作为代理的时候,程序发送的内容和Fiddler转发的内容是一致的,所以我们可以直接修改connect时的ip和端口,再由Fiddler转发即可。

3.
找到afd的驱动对象,并修改它的相关回调


在win2k的代码中,我们可以找到AFD_CONNECT_INFO的描述
typedef struct _AFD_BIND_DATA {
  ULONG				ShareType;
  TRANSPORT_ADDRESS	Address;
} AFD_BIND_DATA, *PAFD_BIND_DATA;
typedef struct  _AFD_CONNECT_INFO {
  BOOLEAN				UseSAN;
  ULONG				Root;
  ULONG				Unknown;
  TRANSPORT_ADDRESS			RemoteAddress;
} AFD_CONNECT_INFO, *PAFD_CONNECT_INFO;

typedef struct _AFD_BIND_DATA {
  ULONG				ShareType;
  TRANSPORT_ADDRESS	Address;
} AFD_BIND_DATA, *PAFD_BIND_DATA;
typedef struct  _AFD_CONNECT_INFO {
  BOOLEAN				UseSAN;
  ULONG				Root;
  ULONG				Unknown;
  TRANSPORT_ADDRESS			RemoteAddress;
} AFD_CONNECT_INFO, *PAFD_CONNECT_INFO;



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-6-19 11:57 被xiaofu编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (10)
雪    币: 4006
活跃值: (726)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
支持下
2019-6-18 19:42
0
雪    币: 6124
活跃值: (4671)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
其实想要lz的配色
2019-6-20 00:04
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
4
黑洛 其实想要lz的配色

这是我的vs配色
2019-6-20 00:07
0
雪    币: 6124
活跃值: (4671)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
xiaofu 这是我的vs配色
感谢大佬!
2019-6-20 00:59
0
雪    币: 5202
活跃值: (9727)
能力值: ( LV9,RANK:181 )
在线值:
发帖
回帖
粉丝
6
学习,难怪发现fiddler有很多会话没有抓到,用wireshark也没有看到。
2019-6-20 13:45
0
雪    币: 1258
活跃值: (608)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
emmm,想要lz的字体
2019-6-21 16:39
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
2019-6-25 11:11
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习
2019-12-3 14:30
0
雪    币: 9
活跃值: (379)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
言下之意就是:afd filter+mitmproxy秒杀一切网络请求了,wss呢?
2021-11-23 21:57
0
雪    币: 3
活跃值: (1056)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
大神写的不错!
帮我看下 我遇到网吧传奇sf驱动层域名劫持 是不是 也是 AFD hook。

发你我分析的连接。
https://bbs.pediy.com/thread-270828.htm
2021-12-20 12:49
0
游客
登录 | 注册 方可回帖
返回
//