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
时间: 2024-08-11 03:36:45

NDIS WIN7 64 WINXP hook网络发包收包的相关文章

Win7 64位下配置Qt5.3和Wincap

最近在学网络编程,想在windows下用Qt做个网络抓包工具,就要用到WinPcap,而我的电脑的系统是Win7 64位,qt版本是Qt 5.3.1 for Windows 64-bit (VS 2013, OpenGL),因此要在Win7 64位系统下配置Qt和WinPcap. 1.到http://www.winpcap.org/install/default.htm下载最新的WinPcap安装包,并安装,运行基于winpcap的程序需要其支持. 2.到http://www.winpcap.o

全模块送4G资料Schlumberger Petrel 2011.1 WIN7 64位 英文版

Schlumberger Petrel 2011.1 WIN7 64位 英文版        Petrel的强大功能不仅可以使用户提高对油藏内部 细 节的认识.精确描述透视油藏属性的空间分布.计算其储量和误差.比较各风险开发模型.设计井位和钻井轨迹.无缝集成油井生产数据和油藏数模数值模拟器.发 现剩余油藏和隐蔽油藏,从而极大地降低开发成本.同样重要的是,Petrel提供的数字模型及虚拟现实技术使技术总工和管理决策者不再限于传统方式那样审 查报告图集和听取多媒体介绍来综合决策, 他们和专业人员一起

Schlumberger Petrel 2011.1 WIN7 64位 英文版全模块送4G资料

Schlumberger Petrel 2011.1 WIN7 64位 英文版全模块送4G资料Petrel是一套目前国际上占主导地位的基于Windows 平台的三维可视化建模软件,它集地震解释.构造建模.岩相建模.油藏属性建模和油藏数值模拟显示及虚拟现实于一体,为地质学家.地球物理学家,岩石物理学 家,油藏工程人员提供了一个共享的信息平台.同时,Petrel应用了各种先进技术:强大的构造建模技术.高精度的三维网格化技术.确定性和随机性沉积相 模型建立技术.科学的岩石物理建模技术.先进的三维计算机

win7 64位 ,安装配置cx_Oracle,遇到的一些问题及解决方法

首先安装配置时,必须把握一个点,就是版本一致!包括:系统版本,python版本,oracle客户端的版本,cx_Oracle的版本,然后安装配置就容易了! 因为我的系统是win7 64位,python版本也是64位的,所以下载安装的Oracle Client 也是64位 10g的,相应的cx_Oracle 也要是64位10g的,当然也要注意python的版    本python2.X还是python3.X,也要下相应的版本的 1.oracle client 下载地址:http://www.ora

怎样在Win7 64位旗舰版安装Python+Eclipse开发环境

原地址:http://www.cnblogs.com/balian/archive/2011/06/19/2084632.html 自从上周抛弃了WinXP转而安装了Win7,64位后,尝试安装Python+Eclipse遇到了一点小问题.现在已经解决,将安装顺序记录如下,供参考. Setp1,到ORACLE网站下载64位的JDK.http://www.oracle.com/technetwork/java/javase/downloads/index.html下载JDK,我下载的是jdk-6u

win7 64 安装mongDB

1. 首先,当然是下载 MongoDB MongoDB的官方网站是:http://www.mongodb.org/, 最新版本下载在:http://www.mongodb.org/downloads .请注意下载适合自己系统的安装包,我选择的是: Windows 64-bit 2008 R2+. 下载后的文件名称是:mongodb-win32-x86_64-2008plus-ssl-3.0.1-signed.msi ,点击安装. 根据官方文档:http://docs.mongodb.org/ma

win7 64位共享打印机

故障一 链接的电脑提示需要密码 处理步聚:取消win7共享计算机上网络的密码保护共享 1.查看网上邻居链接局域网的网络的网络防火墙设置. 2.更改链接局域网的网络的防火墙的更改高级共设置. 3.关闭链接局域网的网络的防火墙的关闭密码共享设置. 故障二 XP链接WIN7 64共享打印机安装打印机驱动总是不成功 处理步聚:在win7共享打印机上安装X86打印机驱动 原因:一般的情况下XP链接XP上共享的打印机会自动安装共享的打印机驱动:但XP链接win7上共享的打印机也提示要安装驱动~但是始终无法安

win7 64位系统 PB连接oracle数据库出现“oracle library oci.dll could not be loaded”问题的解决方法

今天与大家分享一个自己的学习笔记,希望能给遇到同样问题的人带来帮助. 不知道大家在win7 64位系统下用 PB连接oracle数据库时,是否遇到过“oracle library oci.dll could not be loaded”问题. 今天,在win7 64位系统下用 PB连接oracle数据库时,一直出现上述错误,在百度上找了很久,都没有找到一个完整的解决方案,咨询了很多人,(他们都说是我的PB和oracle没装好,但我装的时候没出现任何问题,一切都很顺利,而且PB和oracle都能正

win7/64+pip+pygame=pygame安装

2016/01/09 安装pygame win7/64,之前python版本为3.4 pygame下载地址: http://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame 因为需要兼容,所以下载pygame-1.9.2a0-cp34-none-win_amd64.whl 适合Python3.4的版本文件名中包含cp34,适合64位操作系统的版本,文件名中包含amd64: 选择开始>运行,输入cmd打开命令提示符,在命令提示符中输入: pip install