首页
社区
课程
招聘
[求助]NDIS 协议驱动
发表于: 2016-6-14 15:22 9671

[求助]NDIS 协议驱动

2016-6-14 15:22
9671
NDIS 协议驱动如何来抓取所有发送的数据包呢?   例如winpcap怎么来抓取发送数据包的, 希望大牛多多指点, 或提供相关资料

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 112
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
协议驱动只能抓取所有接收的包
2016-6-14 16:49
0
雪    币: 79
活跃值: (184)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
那winpcap是怎么实现 抓取所有发送的包的,  表面看也是NDIS 协议驱动呀
2016-6-14 17:16
0
雪    币: 112
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
协议驱动绑定每个网卡的实例,微端驱动收到数据后,会触发协议驱动的接收回调。所以应该说是收到接收的包,而不是发送啊。发送完全可以不用你的协议驱动。
2016-6-14 18:34
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
6
最近刚好有研究这方面的课题,下面给出我的研究结果,有错误的地方还请指出:

ndis.sys 库或者其它的 ndis 小端口驱动(网卡适配器驱动)并不是专门给 winpcap 库用来抓取数据包的。 以 wireshark 的windows 版本为例, Wireshark 依赖于 WinPcap 库执行抓包操作,而 npf.sys 作为 WinPcap 库的内核模式组件安装在系统上,对数据包的过滤与抓取提供底层支持;该驱动程序由 Riverbed 公司分发(它是 Wireshark 的商业赞助者。)
根据 virustotal.com 对 npf.sys 的分析得知(我把它上传到 virustotal.com),npf.sys 驱动程序文件带有一个数字证书链,其中包含了多家证书颁发机构的证书,
在主要证书链中,npf.sys 由 VeriSign Class 3 Code Signing 2010 CA 签名,后者由
  VeriSign Class 3 Public Primary Certification Authority - G5 (根证书颁发机构)签名;
在副署证书链中,npf.sys 的副署签名者 Symantec Time Stamping Services Signer - G4 由
Symantec Time Stamping Services CA - G2 签名,后者由 Thawte Timestamping CA (根证书颁发机构)签名:




npf.sys 由服务控制管理器(services.exe)启动,注册表键为
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NPF




npf.sys 代表驱动对象 \Driver\NPF,在我的机器上,它会创建设备对象
\Device\NPF_{81C53900-85A0-41FF-A710-95AC72895448},于是,在 Wireshark 的网卡接口信息中,可以看到如下的内容:




npf.sys 导入了  HAL.dll,NDIS.SYS,以及 ntoskrnl.exe 中的一些例程来实现它的“数据包过滤器”功能,因此我们可以粗略地认为利用关系是:wireshark -> winpcap -> npf.sys -> ndis.sys -> ndis 小端口驱动。
virustotal.com 中的分析如下:




通过内核调试器考察设备对象 \Device\NPF_{81C53900-85A0-41FF-A710-95AC72895448}






通过上面内核调试器命令devstack 的输出可知,npf.sys 创建的设备对象既没有被其它设备对象附加,也没有附加到其他设备对象之上(其设备对象结构的 AttachedDevice 字段为 NULL),因此它处理的是最原始的 I/O 请求(即 I/O 管理器创建的 IRP。如果存在其它驱动程序创建的设备对象附加到 \Device\NPF_{81C53900-85A0-41FF-A710-95AC72895448} 之上,那么发送给它的 IRP 就会先到达附加者,从而附加者可以监控或修改 IRP 再转发给它)

注意,一般我们说的“抓取”含义不够准确,实际上,wireshark 仅仅只是通过上述调用链获取一份主机接收或发送的数据包副本,然后向用户显示。它并没有修改数据包的内容,同时, wireshark 或 winpcap 不是防火墙,它们也不会拦截或者丢弃数据包。
上传的附件:
2016-6-14 19:08
0
雪    币: 79
活跃值: (184)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
原理我知道, 我就是好奇winpcap怎么实现监测所有发出数据包的,  根据网上信息winpcap 也是NDIS 协议驱动
2016-6-14 20:22
0
雪    币: 79
活跃值: (184)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
图都是破的, 而且这个利用关系, 还是不太懂,    npf这个驱动位于NDIS 那一层,  协议, 过滤, 还是小端口。
2016-6-14 20:32
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
9
图片链接是正常的,可能是你那边的线路问题,稍后我转成 pdf 好了。
NDIS(网络驱动程序接口规范)实现在 ndis.sys 中,它是内核网络栈中单独的一层,其上层叫做 ndis 客户,比如 tcpip.sys,它使用 ndis.sys 提供的服务,即 ndis.sys 中的导出函数,比如 NdisAllocatePacket();
ndis.sys 的下层是 nidis 小端口驱动,一般俗称网卡驱动或者 nidis 小端口,它向 ndis.sys 注册一些回调函数,这些函数对网卡硬件执行低级的操作,比如发送数据包;ndis.sys 把这些函数封装成以 ndis*() 打头的例程供上层的协议驱动程序 tcpip.sys 调用。
从 npf.sys 的导入例程来看,由于它没有导入 tcpip.sys 中的例程,可以认为它与 tcpip.sys 是平行的
一层——都位于 ndis.sys 的上层,鉴于 tcpip.sys 是内核网络栈中的“协议驱动程序”,你可以把它看成是一种协议驱动程序。网上信息一般都坑死人不负责的,百度知道中的内容有很多地方有待商榷。
2016-6-14 21:11
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
中间层驱动会向上绑定所有协议驱动,向下会被所有小端口驱动所绑定,中间层驱动适合做防火墙。
2016-6-14 23:52
0
雪    币: 326
活跃值: (56)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
Winpcap驱动工作在第二层,在设置为嗅探模式后可以收到发送包。
2016-6-15 05:33
0
雪    币: 79
活跃值: (184)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
具体原理我知道, 谢谢你的回复, 如果按照以上说法, winpcap 是一个协议驱动, 理论上来说微端驱动收到数据后,会触发协议驱动的接收回调, 这样他是可以接收到所有接收的数据包, 那么发送的数据包, 例如TCP UDP 协议,数据走TCPip.sys  这样发送的数据包就不会通过winpcap  驱动他是如何抓取发送数据包的,这才是我纠结的
2016-6-15 09:07
0
雪    币: 79
活跃值: (184)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
我不是要做防火墙, 我只是想知道 作为协议驱动的winpcap  是如何抓取所有发送数据包的
2016-6-15 09:08
0
雪    币: 79
活跃值: (184)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
作为协议驱动的winpcap  是如何抓取所有发送数据包的
2016-6-15 09:09
0
雪    币: 112
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
注册一个miniport驱动,ddk里有例子,不过建议你使用filter框架
2016-6-15 09:43
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
16
对于发送的数据包,机制是一样的,由于数据包的收发最终都依赖于底层的微端口驱动操作网卡硬件来进行,npf.sys 可以通过调用ndis.sys中的例程,向微端口驱动查询它收发的数据包,
这是因为微端口驱动向ndis.sys注册了一些钩子函数,一旦某个或某些ndis.sys例程被调用,它们在内部
就会转而调用微端口驱动钩子,特定的钩子返回收发的数据包列表到npf.sys,该列表经由内核-用户通信机制,最终返回到wireshark的用户界面并显示.
2016-6-15 10:05
0
雪    币: 111
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
NDIS 协议驱动 如果要 capture 所有 出站的数据包  可以 给 NDIS 协议驱动设置 OID_GEN_CURRENT_PACKET_FILTER 的 OID , 在这个 OID中设置 NDIS_PACKET_TYPE_ALL_LOCAL 标记   就可以 capture 所有出站的数据包了~
2016-6-17 09:25
0
雪    币: 79
活跃值: (184)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
高手,  一语道破天机, 谢谢
2016-6-17 14:27
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
19
学习了
2016-6-18 17:54
0
雪    币: 326
活跃值: (56)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
最近也被这个问题困扰。
2016-6-19 17:54
0
游客
登录 | 注册 方可回帖
返回
//