编写NDIS驱动,完全控制网卡收发报文

本文介绍如何编写NDIS驱动以实现网卡的收发报文控制,替代Winpcap并避免操作系统干扰。该驱动具备接收不提交、丢弃操作系统报文、DLL接口、保存pcap文件、接收缓冲等功能,适用于报文测试模拟,降低了测试设备成本。通过分析Windows DDK的NDIS样例代码,逐步实现驱动并扩展应用层交互和报文发送功能。
摘要由CSDN通过智能技术生成

在windows上面,利用网卡做自定义报文的收发,Winpcap是唯一选择,目前自己编写驱动来实现相关功能的基本找不到。

 

Winpcap对于接收的报文只是复制,并不阻断报文向操作系统提交,因此还是影响了操作系统,导致操作系统时不时的发出一些报文来,而这些报文又可能会干扰我们的测试过程,为了突破这个限制,我重新实现了相关的驱动,做到了以下几个功能:

 

1  和Winpcap一样出色的报文接收和发送功能。函数接口类似,原来的代码不用大修改。

2  接收后的报文不会转交到操作系统。

3  操作系统发出的报文会被无情的丢弃。

4  应用层所有功能封装成一个DLL,直接控制某个网卡调用相关接口函数即可。

5  应用层收到的数据也能够保存为pcap文件格式,这样便于使用wireshark来分析报文。

6  带接收缓冲功能,防止应用层处理不及时而造成丢包。

 

通过这个驱动,被我们控制的网卡相当于从操作系统中脱离,完全被我们控制,这就成了一个收发包的设备了,可以用于报文测试模拟了,而软件模拟的成本比硬件成本低很多,如果我们实现了一个比较好的软件,那么可以节省很多购买测试设备的钱。华为的Tesgine都是可以被部分替换的。当然,软件开发的成本也不小,需要对各种报文有经验的开发人员,另外,网卡的吞吐率只有1G,和仪器设备无法比,需要多个网卡的配合。但还是有很多这方面的需求的。

 

我们编写自定义驱动,当然不需要重头开始,windows的DDK中已经提供了样例,其中,windowsXP版本,可以看WinDDK\760

  对于在“蓝网之家”影响下蠢蠢而动搞 Windows 95 远程启动的朋友可能不少,那么大家一定对 NDIS 这几个字母不会感到陌生。其实不只是在远程启动这一层,只要是网卡驱动盘,大家都会在里面发现有类似 NDIS、NDIS2、NDIS3、NDIS4一样的目录,只是大家在 Windows 9x 或 NT 中安装、设置网卡时没有注意到它罢了。但即使大搞特搞 RPL 的朋友对其大概也是只知其然而不其所以然。    NDIS 是什么?有什么作用?       NDIS 的全称是 Network Device Interface Specification,中文意思就是网络设备接口规范。    根据 OSI 七层模型,物理层定义了对网卡、线缆以及其它物理硬件设备进行配置的标准。节点间建立通信时是由物理层在传输介质上传送二进制信息实现的,因此,在发送端和接收端都还必须有一个程序来格式化这种信息流并将其传送给上一层。NDIS 的作用就是避免在访问网卡每次进行传输时都编写相应的代码。由此说来,NDIS 本质上是一种软件接口,有了 NDIS ,所有的传输就可以采用一种通用的方式来访问由不同厂商制造的网卡了,即它是用来连接协议堆栈和网卡的。   与此相关的软件还有重定向器(Redirector)和服务器(Server)。前者的目的是截获来自 OSI 会话层的网络调用,并通过将其传送到相应的协议驱动程序接口而格式化成 NDIS 能够识别和使用的命令。后者则负责接收从重向器传过来的来自于远程计算机的请求,再将这一请求传送给相应的本地文件系统驱动程序,最后再由该“服务器”将数据沿协议堆栈向下传递给客户机。    TCP协议也是通过调用 NDIS 接口服务来完成传输操作的。
NDIS(网络设备接口规范)是一种Microsoft Windows操作系统中的网络驱动程序模型。NDIS 网卡驱动程序用于管理计算机上的网络接口卡(NIC),负责将数据包从计算机发送到网络,以及将数据包从网络接收到计算机。下面是一个简单的示例代码,演示了如何在NDIS 网卡驱动程序中收发数据包。 首先,需要引入NDIS驱动的头文件和库文件。接着,定义一个NDIS驱动的设备对象,并初始化该对象。然后,创建一个NDIS包接收处理函数,用于接收和处理从网络接口卡接收到的数据包。在该函数中,可以使用NDIS提供的函数来获取和处理接收到的数据包。 示例代码如下所示: ```cpp #include <ndis.h> NDIS_HANDLE g_NdisDeviceHandle; NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath ) { // 初始化NDIS驱动设备对象 NDIS_MINIPORT_CHARACTERISTICS npChars = { 0 }; npChars.MajorNdisVersion = NDIS_MAJOR_VERSION; npChars.MinorNdisVersion = NDIS_MINOR_VERSION; // 设置NDIS回调函数 // ... // 创建NDIS设备对象 NdisMInitializeWrapper( &g_NdisDeviceHandle, DriverObject, RegistryPath, NULL ); // 注册NDIS设备对象 // ... return STATUS_SUCCESS; } NDIS_STATUS NdisReceivePacket( NDIS_HANDLE NdisMiniportHandle, PNDIS_PACKET Packet ) { // 处理接收到的数据包 // 获取数据包的数据 PVOID dataBuffer = NULL; UINT dataLength = 0; NdisQueryPacket( Packet, NULL, NULL, &dataBuffer, &dataLength ); // 处理数据包 // ... return NDIS_STATUS_SUCCESS; } ``` 以上是一个简单的示例,展示了如何在NDIS网卡驱动程序中收发数据包的基本流程。根据实际需求,可以在此基础上进行修改和扩展。请注意,此示例仅为了说明目的,并非可编译代码。在实际应用中,需要根据具体系统和驱动程序的要求进行相应的实现和调试。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值