ndis协议驱动总结

本文介绍了协议驱动的原理及其在网络嗅探器中的应用。详细解释了如何通过NDIS_PROTOCOL_CHARACTERISTICS注册协议驱动,实现网卡绑定、包接收与处理等关键步骤。此外还讨论了协议驱动与应用层交互的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协议驱动用于嗅探器,比如wincap就是协议驱动,不用于防火墙。

1.DriverEntry中

 填写协议特征NDIS_PROTOCOL_CHARACTERISTICS,就是协议的回调函数列表。

 调用NdisRegisterProtocol注册为协议驱动。

 创建设备对象及符号链接。

 系统会对每个存在的网卡实例,调用本协议驱动在协议特征集中提供的一个回调函数。故协议驱动适用于监听收包,不适合监听发包。

 这个回调函数中决定是否绑定网卡,绑定后,网卡收到的包会提交给协议驱动。

 应用层可以打开这个协议驱动,使用deviceioControl或者readfile,writefile使用这个协议发包。故需要填写分发函数,用于控制设备。

 一般的协议驱动都是绑定所有网卡。一个网卡也绑定多个协议。一般来说,一个数据包只会被一个协议处理,协议会无视它收到的并非本协议处理的数据包,比如tcp/ip和ipx。

2.绑定网卡适配器的回调实现。

 每当有一个网卡被绑定,则分配内存空间保存和这次绑定相关的信息及所用的资源,比如锁和队列,这就是打开上下文。

 绑定回调函数NdisProtBindAdapter的工作:

 a.打开上下文的分配和初始化。b。读取配置,判断执行环境c。保存打开上下文到全局链表,调用ndisprotCreateBinding完成实际绑定。

 ndisprotCreateBinding工作:

 实际绑定只需要NdisOpenAdapter,这个打开适配器就是将一个协议绑定到一个网卡,返回绑定句柄。

 由于支持即插即用,网卡随时卸载,故需要解决绑定的同步竞争问题。ndisprotCreateBinding函数的工作有三个:

 a。防止多线程竞争“打开上下文”。b。分配和初始化绑定相关资源,比如输入,输出缓冲区的包池及缓冲池。c。获得网卡参数。

 每个以太网包用一个包描述符ndis_packet描述。用包池存储。包实际内容不在里面,用一个包缓冲区描述符ndis_buffer描述,用缓冲池存储。通过池减少动态分配内存的消耗。

 OIDs是ndis的上层驱动调用NdisRequest给下层驱动发送的请求类型号,下层驱动返回约定的结果。比如获得一个网卡的物理地址或最大帧长.请求的的pending完成函数在协议特征集

 的RequestCompleteHandler设置 

3.绑定的解除

 当有一个网卡被拔出时,windows内核会调用协议特征集中的解除绑定回调来解除协议和网卡的绑定。解除绑定用NdisCloseAdapter.解除绑定过程中可能会接收到新包或者有新包发送,

 必须向网卡发送oid请求停止提交新的数据包。

4.应用层和驱动交互接收收到的包

 应用层可以作为包嗅探器的展示界面。

 a.使用createfile打开协议的控制设备对象符号链接,得到句柄。b. 使用deviceiocontrol等待绑定结束。c. 使用writefile发包,readfile接收数据包.d.使用closefile关闭句柄 

5. 内核层完成分发函数,提供应用层接口

 a.读请求就是从缓冲队列里检测数据包,有则拷贝到读请求的输出缓冲区。

 b.写请求就是发包请求,可以任意发出以太网包,具有网络攻击能力。在NdisProtSendComplete包发送完成函数中完成请求。

6. 接收回调

 ReceiveHandler和ReceivePacketHandler在被绑定的网卡收到数据包时都可能会被调用.参数中的前视区LookaheadBuffer包数据部分开始的前几个字节,用于快速检测是否提交包。

参数中只有包头和数据前几个字节。在ReceiveHandler中,检查包头,分配包描述符和缓冲描述符,拷贝包头。完整的数据应该调用NdisTransferData,但不包括包头.传输完整数据后会调用TransferDataCompleteHandler.在完成函数中将包保存到接收队列。用NidsGetNextBuffer可以从一个节点得到它下面一个节点,包的数据保存在一个缓冲区描述符链表里。

 

--写于2013-12-30

  对于在“蓝网之家”影响下蠢蠢而动搞 Windows 95 远程启动的朋友可能不少,那么大家一定对 NDIS 这几个字母不会感到陌生。其实不只是在远程启动这一层,只要是网卡的驱动盘,大家都会在里面发现有类似 NDISNDIS2、NDIS3、NDIS4一样的目录,只是大家在 Windows 9x 或 NT 中安装、设置网卡时没有注意到它罢了。但即使大搞特搞 RPL 的朋友对其大概也是只知其然而不其所以然。    NDIS 是什么?有什么作用?       NDIS 的全称是 Network Device Interface Specification,中文意思就是网络设备接口规范。    根据 OSI 七层模型,物理层定义了对网卡、线缆以及其它物理硬件设备进行配置的标准。节点间建立通信时是由物理层在传输介质上传送二进制信息实现的,因此,在发送端和接收端都还必须有一个程序来格式化这种信息流并将其传送给上一层。NDIS 的作用就是避免在访问网卡每次进行传输时都编写相应的代码。由此说来,NDIS 本质上是一种软件接口,有了 NDIS ,所有的传输就可以采用一种通用的方式来访问由不同厂商制造的网卡了,即它是用来连接协议堆栈和网卡的。   与此相关的软件还有重定向器(Redirector)和服务器(Server)。前者的目的是截获来自 OSI 会话层的网络调用,并通过将其传送到相应的协议驱动程序接口而格式化成 NDIS 能够识别和使用的命令。后者则负责接收从重向器传过来的来自于远程计算机的请求,再将这一请求传送给相应的本地文件系统驱动程序,最后再由该“服务器”将数据沿协议堆栈向下传递给客户机。    TCP协议也是通过调用 NDIS 接口服务来完成传输操作的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值