NDIS WIN7 64 WINXP hook网络发包收包

转:
   网上有不少讨论关于NDIS HOOK的文章,但大多只讲了WIN7以前的HOOK NDIS_OPEN_BLOCK下的例程,至于WIN7下怎么
HOOK以及如何作MINIPORT-HOOK,网络上则鲜有说起.根据前阵子的相关分析,我把NDIS HOOK总结一下,网上有一些讨论
NDIS HOOK的文章,请读者先阅读那些文章对NDIS HOOK有个基本了解.

[0x01] 

    首先是获取物理网卡的设备GUID,若是只是作普通的NDIS HOOK则能够忽略此步.为何要获取物理网卡的GUID呢,
由于系统内可能有多个MINIPORT,每一个MINIPORT对应一个网卡设备,不管这个网卡是虚拟的仍是物理的.
    
    因此咱们要作MINIPORT HOOK的话就必须找到物理网卡对应的miniport.下面是两种得到物理网卡GUID的方法。

   方法1:经过注册表项\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards
得到网卡的设备名,好比{F0AFC092-E841-48DF-909F- 78146070F5D3},不过在有些系统下没有这个注册表项,因此这种
方法不通用.

   方法2:仍是经过注册表,首先遍历HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI下的子键,当遍历到第
二级的时候,好比
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_10DE&DEV_0BE4&SUBSYS_00000000&REV_A1\4&2f49a5f6&0&0108.
   
   则获取当前设备的ClassGUID,若是ClassGUID为{4d36e972-e325-11ce-bfc1-08002be10318},则说明当前设备为网络
适配器设备,那么咱们再继续读名为Driver的键值,其数据通常为相似{4d36e972-e325-11ce-bfc1-08002be10318}\0007
这样的值.

   而后咱们把这个值拼接到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class这个路径后面组成
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0007,
这个子键下的键值NetCfgInstanceId即为物理网卡的设备GUID.
 
[0x02]

    XP NDIS HOOK:经过注册假协议,遍历全部NDIS_OPEN_BLOCK,挂接TCPIP协议下全部的NDIS_OPEN_BLOCK里的相关例程
便可(ReceiveHandler,ReceivePacketHandler,WanSendHandler,SendHandler,SendPacketsHandler等),这在其余讲述
NDIS HOOK的文章里均有描述,这里再也不赘述.

    XP NDIS MINIPORT HOOK:仍然先要注册假协议,找到DeviceName是物理网卡设备GUID的NDIS_OPEN_BLOCK,挂接其
WSendHandler或者WSendPacketsHandler便可.只有这个NDIS_OPEN_BLOCK才是绑定到物理网卡的.从而避免挂接到绑定
到其余虚拟网卡的NDIS_OPEN_BLOCK或者中间层过滤驱动同上层协议之间的绑定关系(还记得吗,中间层过滤驱动的
upperlayer向上对协议驱动表现为MINIPORT).

[0x03]

    WIN7 NDIS HOOK:仍然是遍历全部NDIS_OPEN_BLOCK:拦截Send操做须要Inline Hook ndis!NdisSendNetBufferLists,
或者HOOK TCPIP.SYS的IAT里的ndis!NdisSendNetBufferLists,拦截Receive操做须要Hook NDIS_OPEN_BLOCK里的
ReceiveNetBufferListsHandler.

    WIN7 MINIPORT HOOK:遍历NDIS_OPEN_BLOCK,找到DeviceName是物理网卡设备GUID的NDIS_OPEN_BLOCK,根据NDIS_OPEN_BLOCK
定位到对应的NDIS_MINIPORT_BLOCK,而后定位到M_DRIVER_BLOCK结构体(offset:0xE04),而后M_DRIVER_BLOCK的偏移0x60
处就是MINIPORT的发送函数SendNetBufferListsHandler,直接挂接这里便可.
 
[0x04]

其余说明:
NDIS_PRPTOCOL_BLOCK:这个结构表示协议相关的信息,每一个协议对应一个

NDIS_OPEN_BLOCK:这个结构是表示协议(PROTOCOL)和网卡(MINIPORT)的绑定关系的

NDIS_MINIPORT_BLOCK:这个结构是表示小端口信息的,除了物理网卡和虚拟网卡存在这个结构外,IMD(中间层过滤驱动)由
因而向上表现为MINIPORT,因此IMD也存在一个本结构

IMD:向上表现为MINIORT,向下表现为PROTCOL,因此IMD和PROTOCOL之间也存在NDIS_OPEN_BLOCK,而IMD和下层的MINIOPORT
也存在NDIS_OPEN_BLOCK
相关文章
相关标签/搜索