博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NDIS WIN7 64 WINXP hook网络发包收包
阅读量:5307 次
发布时间:2019-06-14

本文共 2389 字,大约阅读时间需要 7 分钟。

转:   网上有很多讨论关于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

 

转载于:https://www.cnblogs.com/element-Garfield/p/4160186.html

你可能感兴趣的文章
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
JavaScript动画打开半透明提示层
查看>>
Mybatis生成resulteMap时的注意事项
查看>>
jquery-jqzoom 插件 用例
查看>>
1007. Maximum Subsequence Sum (25)
查看>>
iframe的父子层跨域 用了百度的postMessage()方法
查看>>
图片生成缩略图
查看>>
动态规划 例子与复杂度
查看>>
查看oracle数据库的连接数以及用户
查看>>
【数据结构】栈结构操作示例
查看>>
中建项目环境迁移说明
查看>>
三.野指针和free
查看>>
activemq5.14+zookeeper3.4.9实现高可用
查看>>