科普NDIS封包过滤
闲言:
这个月一直在学习NDIS驱动编程,杂七杂八的资料都看个遍了,做了点笔记,捋捋思路,发上来备忘。
Ps:只是小菜的一点学习笔记,没什么技术含量,不过版主如果觉得对大家稍微有点帮助的话,嘿嘿,你懂的...
主题:
由于NDIS架构本身相对比较复杂,有着比其他过滤驱动更多的"游戏规则"需要开发者耐心地学习和理解。所以NDIS驱动开发起来略显繁琐,不过也不必畏惧,多看多写,熟悉后便豁然开朗了。本文以寒江独钓的passthru为例,详细讲解开发一个基于NDIS中间层驱动的封包过滤驱动的原理和流程。由于笔者初学驱动,水平有限,失误之处还请大虾不啬赐教。
1.[前置知识]
所有网络通信最终必须通过NDIS完成,NDIS横跨传输层/网络层/数据链路层。NDIS负责上下层驱动程序间服务原语与驱动程序入口之间的转换,分派消息通知。NDIS提供三个层次的接口:网络接口卡驱动程序(NIC)、中间层驱动程序(MD)和协议驱动程序。
NIC: 下端直接控制网络接口卡硬件,上端提供接口,处理初始化网卡、停止网卡、发送和接受数据包。
PD: 接收来自网卡或中间驱动程序的信息。
MD: 网卡驱动和协议驱动之间的桥梁。插入自己的中间层驱动,从而可以截获网络封包,并重新进行封包、加密、网络地址转换、过滤和认证等操作。可以处理更低级的操作、功能强大,但是编程接口复杂,自动化安装困难,容易导致网络瘫痪。
windows内核网络驱动的总体格局(从下至上):小端口驱动实现了对网卡硬件的驱动,包括对其中各个寄存器的访问、中断处理等。协议驱动将链路层、网络层和传输层集合在一起的一个驱动模块。上层是传输驱动界面(TDI)。TDI上层是用来实现Socket机制的AFD驱动模块。
(参见《内核情景分析》 第十章 第一小节)
2.[NDIS架构简析]
这里对协议驱动和小端口驱动的流程理解都是参考WDK的相应代码总结出来的。详细的代码我就不贴了,节省版面,都是WDK上的原版代码,对一些具体的实现细节有兴趣的童鞋可以自己看看。一些核心函数可以参考ReactOS源码,能够更深层次地理解NDIS内部的结构。直接贴初始化流程图。将NDIS的流程和框架搞清楚了,再深究细节就不那么容易晕了。小菜我研究这玩意的时候,晕了无数次了。由于本文重点在于封包过滤,所以对于NDIS协议驱动和小端口驱动的初始化和收包发包过程仅做一些简单的梳理。核心部分还是在中间层驱动。
NDIS协议驱动 [初始化]
流程图来源思路DDK2000/Packet:

NDIS小端口驱动 [初始化]
NDIS_MINIPORT_CHARACTERISTICS –> NdisMInitializeWrapper -> NdisMRegisterMiniport
关键部分就是填写小端口驱动特征,设置各种回调,编写NDIS驱动程序的本质就是处理各色各样的回调,有初始化的有卸载的,也还有响应中断进行收包发包的等等等等。编写回调虽是编写NDIS驱动的核心,但不在本节讨论范围。小端口初始化流程,详见下图:

NDIS收包发包的总体流程 [小端口+协议]
收包由响应网卡产生的中断开始,发包由TDI传入协议驱动的IRP开始。

3.[封包过滤]
原理:由于NDIS中间层驱动位于协议驱动程序和网络驱动程序之间,所以它可以看到发生在一个系统中的所有网络流量。而不是像协议驱动那样只能看到从网络到来的封包。中间层驱动用于封包过滤和防火墙开发再适合不过了。这里以寒江独钓中的passthru为例编写一个具有端口屏蔽的过滤驱动。
①中间层驱动的初始化 [passthru]
1.初始化小端口部分:
NdisMInitializeWrapper -> NDIS_MINIPORT_CHARACTERISTICS –> NdisIMRegisterLayeredMiniport
2.初始化协议驱动部分并关联至小端口:
NDIS_PROTOCOL_CHARACTERISTICS -> NdisRegisterProtocol -> NdisIMAssociateMiniport
3.passthru初始化总体结构

②封包结构分析与过滤 [TCP端口过滤]
要对TCP端口进行过滤,很明显必须得先对TCP协议封包的结构进行分析。不同协议的封包格式都不尽相同,对封包格式有兴趣的童鞋可以使用wireshark多抓几个进行分析。如上图所示,寒江独钓中的例子中在每一个发包与收包的相关回调函数中都调用了AnalysisPacket函数对封包进行分析。如果需要添加我们的过滤规则的话,在这个中函数进行即可。TCP协议的封包总共有三个部分:第一是以太网部分,第二是IP部分(前两部分是所有协议的封包都有的),第三就是TCP部分了。
下面是使用wireshark抓到的TCP协议封包:

再来看看TCP HEADER的定义:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
