| « | December 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | |
| 登录 |
|
| 联系我 email: binaryluo(at)gmail.com
|
Blog信息 |
|
blog名称:二进制-虚心使人进步,骄傲使人落后。 日志总数:42 评论数量:370 留言数量:88 访问次数:646058 建立时间:2005年2月19日 |

| |
|
[网络编程技术]NDIS截获数据包学习笔记(一) 原创空间, 读书笔记, 软件技术
binaryluo 发表于 2006/1/23 23:03:30 |
|
网络驱动程序接口规范(NDIS)是微软为网络接口卡(NIC)的局域网驱动程序提供的一种标准应用程序接口(API)。NDIS
适用于服务器或工作站。NDIS 标准支持计算机通过不同的通信协议与网络相连,如:TCP/IP、IPX、NetBIOS、AppleTalk
等。
NDIS 在数据链路层(第二层)的媒体控制层(MAC)执行其功能。NIC 硬件实现过程与媒体访问控制(MAC)设备驱动程序紧密相关,这样利用通用编程接口,可以访问同一媒体(如以太网)的所有网络接口卡。其次
NDIS 还具有关于网络驱动程序硬件的功能库,主要用于 MAC 驱动和更高级的协议驱动(如 TCP/IP)。利用功能库的各种功能支持,使得
MAC 和协议驱动的开发过程变得相对简单,同时在某种程度上,掩盖了平台的依赖特性。此外通过 NDIS,也可以帮助网络驱动程序维护状态信息和参数,包括联接或其它系统值中涉及的指针功能、句柄及参数块等。
NDIS 支持以下网络驱动类型:
小端口驱动(Miniport Driver)
中间层驱动(Intermediate Driver)
协议驱动(Protocol Driver)
500)this.width=500'>
Miniport driver,NDIS微端口网卡驱动,位于最底层,直接操纵网卡并且对高层驱动提供接口,也是我们常说的网卡驱动。
Intermediate drivers,NDIS中间层驱动(IMD驱动),这是界于链路层和网络层之间的驱动,这就是今天的主角,位于1和3之间。
Protocol drivers,NDIS协议驱动,高层协议驱动,俗称为TDI(传输驱动程序接口),高于前面两层,直接面向用户级,为用户提供网络服务,也就是绝大多数程序所用到的网络接口。例如TCP/IP协议驱动。
IMD驱动
IMD中间层,它的实质很简单,最经典的描述莫过于下面的话:
An
intermediate driver is typically layered over one or more NDIS NIC
drivers and under a transport driver (possibly multilayered) that
supports TDI at its upper edge.
An NDIS intermediate driver exports MiniportXxx functions at its upper edge and ProtocolXxx functions at its lower edge.(见DDK文档)
中
间层插入网卡和协议层之间,对上面的协议层表现为一个虚拟的微端口网卡结构,而对下面的网卡则表现为一个协议层的结构。所以,无论是网卡接收并上传的数据
报,还是上层要下送至网卡发送的数据报,无一例外地要经过中间层。所以,我们可以在中间层加入我们想要过滤的数据报的特征,实现基于中间层驱动的内核级包
过滤。这样做的优势非常明显,首先,在驱动级别上做过滤,无须组包,速度快,效率自然就高;其次,所有的数据报无一例外,只要网卡上传的数据报均可以截
获,避免了用户级无法得到所有数据报的缺点。当然,世界上没有完美的事情。IMD包过滤技术也存在其不可避免的缺点,与操作系统版本关系密切,与硬件联系大,可移植性低。我在调试这个驱动的时候,就碰到了无数次蓝屏,无数次重启动,进了几次安全模式,甚至还为此重新安装了一次系统。
总的来说,要拦截Windows下的网络数据包可以在两个层面进行:用户态(user-mode)和内核态(kernel-mode)
用户态下的网络数据包拦截
在用户态下进行网络数据包拦截有以下几种方法:
1) Winsock Layered Service Provider (LSP)。这种方法在MSDN里有很详细的文档,并且给出了一个例子(SPI.CPP)。这种方法的好处是可以获得调用Winsock的进程详细信息。这就可以用来实现QoS,数据流加密等目的。但是,如果应用程序直接通过TDI(Transport Driver Inface)调用TCPIP来发送数据包,这种方法就无能为力了。对于一些木马和病毒来说要实现通过TDI直接调用TCPIP是一件很容易的事情。因此,大多数的个人防火墙都不使用这种方法。国内也有使用该方法实现的个人防火墙,例如Xfilter(www.xfilter.com)。
2) Windows 2000 包过滤接口。Windows 2000 IPHLP API提供了安装包过滤器的功能。但是,包过滤的规则有很多限制,对于个人防火墙来说是远远不够的。
3) 替换系统自带的WINSOCK动态连接库。这种方法可以在很多文章里面找到详细的实现细节。
很显然,在用户态下进行数据包拦截最致命的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包无法进行处理。对于一些木马和病毒来说很容易避开这个层次的防火墙。
利用驱动程序拦截网络数据包
大多数的个人防火墙都是利用网络驱动程序来实现的。从图1中我们马上可以想到可以从以下几个方面来做文章:
1、TDI过滤驱动程序(TDI Filter Driver)
2、NDIS中间层驱动程序(NDIS Intermediate Driver)
3、Win2k Filter-Hook Driver
4、NDIS Hook Driver
TDI过滤驱动程序。当应用程序要发送或接收网络数据包的时候,都是通过与协议驱动所提供的接口来进行的。协议驱动提供了一套系统预定义的标准接口来和应用程序之间进行交互。在Windows 2000/NT下,ip,tcp,udp是在一个驱动程序里实现的,叫做tcp.sys,这个驱动程序创建了几个设备:DeviceRawIp,DeviceUdp,DeviceTcp,DeviceIp, DeviceMULTICAST。应用程序所有的网络数据操作都是通过这几个设备进行的。因此,我们只需要开发一个过滤驱动来截获这些交互的接口,就可以实现网络数据包的拦截。TDI层的网络数据拦截还可以得到操作网络数据包的进程详细信息,这也是个人防火墙的一个重要功能。
NDIS中间层驱动。中间层驱动介于协议层驱动和小端口驱动之间,它能够截获所有的网络数据包(如果是以太网那就是以太帧)。NDIS中间层驱动的应用很广泛,不仅仅是个人防火墙,还可以用来实现VPN,NAT,PPPOverEthernet以及VLan。中间层驱动的概念是在Window NT SP4之后才有的,因此对于Windows9x来说无法直接利用中间层驱动的功能。Windows DDK提供了两个著名的中间层驱动例子:Passthru以及Mux。开发人员可以在Passthru的基础上进行开发,Mux则实现了VLan功能。目前个人防火墙的产品还很少用到这种技术,主要的原因在于中间层驱动的安装过于复杂,尤其是在Windows NT下。Windows 2000下可以通过程序实现自动安装,但是如果驱动没有经过数字签名的话,系统会提示用户是否继续安装。中间层驱动功能强大,应该是今后个人防火墙技术的趋势所在,特别是一些附加功能的实现。
Win2k Filter-Hook Driver。这是从Windows2000开始系统所提供的一种驱动程序,该驱动程序主要是利用ipfiltdrv.sys所提供的功能来拦截网络数据包。Filter-Hook Driver在结构非常简单,易于实现。但是正因为其结构过于简单,并且依赖于ipfiltdrv.sys,Microsfot并不推荐使用Filter-Hook Driver。
NDIS Hook Driver。这是目前大多数个人防火墙所使用的方法。Hook的概念在Windows9x下非常流行,而且实现也很容易。
|
|
回复:NDIS截获数据包学习笔记(一) 原创空间, 读书笔记, 软件技术
JFJ(游客)发表评论于2007/1/5 23:06:01 |
|
以下引用superbao(游客)在2006-4-23 23:55:14的评论:
binaryluo:你好!
看了你写的[网络编程技术]NDIS截获数据包学习笔记(一),感触很深,希望你能在百忙中帮我指导一下毕业论文,题目是<<在NDIS微端口层实现网络数据包分析>>,要求是:"在NDIS微端口层实现数据包的截获与分析,并对数据包进行分类。当前的抓包程序种类比较多,但总结起来不外乎应用层抓包和NDIS中间层抓包两种。在开发NDIS中间层驱动时,使用现有的抓包程序往往会出现抓包程序与所开发的驱动绑定层次混乱的现象。本课题从这一实际问题入手,利用自研的专用网卡及其驱动程序开发出一套在NDIS中间层之下的抓包程序,它将为进一步研究和开发NDIS驱动提供极大的支持。",大虾小弟谢谢
我的qq是617673439,加我好吗?
希望我们能成为好朋友!
我是解放军信息工程大学的,我等着你的好消息!
真丢解放军的人!!!
|
|
回复:NDIS截获数据包学习笔记(一) 原创空间, 读书笔记, 软件技术
superbao(游客)发表评论于2006/4/23 23:55:14 |
|
binaryluo:你好!
看了你写的[网络编程技术]NDIS截获数据包学习笔记(一),感触很深,希望你能在百忙中帮我指导一下毕业论文,题目是<<在NDIS微端口层实现网络数据包分析>>,要求是:"
在NDIS微端口层实现数据包的截获与分析,并对数据包进行分类。当前的抓包程序种类比较多,但总结起来不外乎应用层抓包和NDIS中间层抓包两种。在开
发NDIS中间层驱动时,使用现有的抓包程序往往会出现抓包程序与所开发的驱动绑定层次混乱的现象。本课题从这一实际问题入手,利用自研的专用网卡及其驱
动程序开发出一套在NDIS中间层之下的抓包程序,它将为进一步研究和开发NDIS驱动提供极大的支持。",大虾小弟谢谢
我的qq是617673439,加我好吗?
希望我们能成为好朋友!
我是解放军信息工程大学的,我等着你的好消息!
|
|
回复:NDIS截获数据包学习笔记(一) 原创空间, 读书笔记, 软件技术
feiyu_lili发表评论于2006/3/7 16:22:43 |
|
以下引用violet(游客)在2006-3-7 11:29:03的评论:请问楼主知道linux 下有无此类可以将包截取而不是仅仅获得包的一份拷贝的接口呢?
你什么意思?winpcap本身就不影响数据栈的阿!
在linux有libpcap这个库和winpcap很类似的。我的blog上有libpcap的转载资料(psbinaryluo 我不是在和你抢生意哦,嘿嘿)。libpcap基本适用于任何unix系统linux当然不例外。
|
|
回复:NDIS截获数据包学习笔记(一) 原创空间, 读书笔记, 软件技术
violet(游客)发表评论于2006/3/7 11:29:03 |
|
请问楼主知道linux 下有无此类可以将包截取而不是仅仅获得包的一份拷贝的接口呢?
|
» 1 »
|