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;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-6-19 11:57
被xiaofu编辑
,原因: