1、TDI HOOK
TDI Client利用TDI接口,向TDI Server发送IRP(I/O Request Packet)请求包,来获得TDI Server提供的服务。因此,可以利用分层驱动原理[5],在TDI Client和TDI Server驱动之间加一层过滤驱动-FilterDriver.sys。对于TCP/IP协议而言,在Windows网络协议体系结构中是由Tcpip.sys驱动实现的。Tcpip.sys创建了几个设备对象,/Device/RawIp,/Device/Udp,/Device/Tcp,/Device/Ip, /Device/MULTICAST来接收TDI Client的IRP请求包。所以,我们可以在这些设备对象上挂接自己的设备对象,当TDI Client向TDI Server发送IRP包时,该IRP包首先被我们的设备对象截获并交由我们的过滤驱动FilterDriver.sys处理,如果允许这个IRP包下发就放行,否则,在我们的过滤驱动FilterDriver.sys中请求I/O管理器完成该IRP请求。TDI HOOK后结构示意图如下图:
2、NDIS HOOK
NDIS HOOK 就是通过自定义的回调例程替换NDIS wrapper 的相应函数,使得系统调用被截获的一种系统监视机制。常见实现NDIS hook 的方法是修改NDIS. sys 的导出表(export table),这种方法需要在操作系统重启后才可以生效[ 1 ]。我们提出的是一种注册假协议(fake protocol)的方法,它没有重启限制,不仅加快了开发调试,还可以方便防火墙的使用。
在Windows NT 系统内核中,所有已注册的网络协议都是通过一个单向链表来维护的。链表的节点结构为NDIS_PROTOCOL_BLOCK,NDIS_PROTOCOL_CHARACTERISTICS地址就在这个结构中,NDIS_PROTOCOL_CHARACTERISTICS中保存了收包函数地址和注册网络协议时所指定的各种信息,如支持协议即插即用的回调函数地址等。每个协议驱动都对应一个NDIS_OPEN_BLOCK 结构的单向链表来维护其所绑定的适配器信息,协议驱动发送的回调函数地址就保存在这个结构中,我们只需替换这些地址就可以控