过滤报文的几种方式

1、windows的分层网络构架
可以把windows操作系统的网络构架粗略划分为6层,其中逻辑链路层、网络层和传输层都是通过传输驱动程序实现的,也叫做协议驱动程序。网络驱动接口标准(NDIS)用于windows环境下网络驱动程序的开发,NDIS提供了很多功能函数,在各种驱动程序的编写中只需要调用各种函数,NDIS负责把上下层驱动程序联系起来,实现网络数据包的上下发送与接收。

例如,当协议驱动程序分配包,从应用程序中将数据拷贝到包中,并且通过调用NDIS函数将这些包发送到底层驱动程序中。协议驱动程序也为从下层驱动程序中接收包提供了接口,协议驱动程序将接收到的数据包转换成相应的客户应用程序。

2、网络数据包的过滤方法
2.1 基于NDIS包拦截技术
数据包的拦截技术,其中最多的是编写IM Driver在DDIS中间层对Min Port(网卡驱动程序)和协议驱动程序之间的数据包进行拦截,这是微软提供的一种技术。

中间层驱动程序,由于其特殊的位置,使得它既能与上层协议驱动进行通信又能与下层端口驱动程序通信。当接收来自上下层的数据包时,中间驱动程序需要MinPortSend、ProtocolTeceive、MinportSendPacket、protocolReceivePacket、MinportTransferData进程来完成数据的传输。

下面再介绍一种更有效的基于NDIS包拦截方法,NDIS协议驱动程序是通过填写一张NDIS_PROTOCOL_CHARACTERISTICS的表,并调用NDIS API函数NdisRegister Protocol进行注册。现在关注一下NDIS_PROTOCOL_CHARACTERISTICS这张表,这张表中存有所有协议驱动程序与底层的派发函数的入口,如SendHandler、ReceiveHandler、BindAdapterHandler等。

当网卡有数据包进入时,会通过表中的ReceiveHandler或ReceivePacketHandler通知协议驱动程序有一个该协议的数据包进入,反之协议驱动程序是通过SendHandler或SendPacketsHandler函数向网卡驱动发送数据包到网络上去的,通过NDIS.h的头文件知道通过这个表中的SendHandler或SendPacketsHandler发送的,只要将每一个协议程序所填写的NDIS_Protocol_characteristics表里的派发函数指向自己的函数,就能成功的对数据包进行拦截。

看下面的NdisRegisterProtocol原型就清楚了。

[cpp] view plaincopyprint?
01.NdisRegisterProtocol(OUT PNDIS_STATUS Status,OUT PNDIS_PROTOCOL_BLOCK NdisProtocolHandle,IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,IN U INT CharacteristicsLength);
NdisRegisterProtocol(OUT PNDIS_STATUS Status,OUT PNDIS_PROTOCOL_BLOCK NdisProtocolHandle,IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,IN U INT CharacteristicsLength);


如果查询成功,返回一个非零值。

2.2 基于WinPcap抓报的过滤方法
winpcap(windows packet capture)核心功能是捕获网络数据包,其中NPF是一个虚拟设备驱动程序文件,它的功能是过滤数据包,并把这些数据包原封不懂地传给用户态模块,如下图:


图中箭头方向表示网络数据包的流动方向,NPF工作在内核层,它从网卡驱动程序收集网络数据包,

既可以发送过滤部件,对网络数据包进行过滤;

也可以发送给统计部件,对网络进行统计分析;

还可以发送给存储部件,把网络数据包直接存储到磁盘。

winpcap的优势:提供了一套标准的抓包接口,与Libpacp兼容,可使得原来许多Unix平台下的网络分析工具快速移植过来,便于开发各种网络分析工具,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。



2.3 传输层过滤驱动程序
挂接到TCP/IP协议驱动程序上对TCP协议做过滤的驱动程序,工作在传输层,将本身作为过滤驱动程序挂接到其他驱动程序上 并截获IRP请求及进行IRP请求的转发,从而能够实现网络数据包的截获与过滤功能,挂接到TCP/IP的驱动程序前后对照如图:


可以用IoAttachDeviceToDeviceStack或IoAttachDevice函数将过滤驱动依附到TCP或UDP设备上,就可以在IRP的处理过程中得到相应的网络数据,并且可以根据需要进行过滤。

2.4 实用Filter-hook驱动程序
filter-hook驱动程序是一个用于过滤网络数据包的内核驱动程序,它扩展了系统支持的IP过滤驱动程序的功能,并且仅能安装在WIN2000及以后的版本中,在系统中Filter-hook驱动程序仅能有一个实例被IP过滤驱动程序使用,由于它向IP过滤驱动程序注册自己,因此它运行时需要先加载IP过滤驱动程序,即 ipfltdrv.sys

filter-hook驱动程序向IP过滤驱动程序注册回调函数,当发送或接收每一个IP数据包时,IP过滤驱动程序将调用这个函数,这样就可以说在函数中对IP数据进行修改或者过滤。

2.5 采用RAW winsock
windows系统提供的winsock2增加了许多新特性,winsock2允许程序使用WSA Toctl给一个Sock_RAW类型的socket Rcvall属性,这样socket就可以收到所有经过本机的数据了,因此可以利用socket编写接口,绕过复杂的NDIS驱动程序设计,来达到接收网络数据包的目的。首先,调用WSA socket函数建立SOCK_RAW套接字,并指定网络协议类型为IP,然后得到当前网卡设置的IP地址与建立的套接字绑定,在设置接受属性好就可以接收数据了。

Raw Socket:原始套接字
可以用它来发送和接收IP层以下的原始数据包,如ICMP、TCP、UDP、、、、

[cpp] view plaincopyprint?
01.int sockRaw = socket(AF_NET, SOCK_RAW, IP_PROTO_RAW);
int sockRaw = socket(AF_NET, SOCK_RAW, IP_PROTO_RAW);这样就创建了一个Raw Socket.。



结论:
由于windows系统的网络结构是分层,根据过滤数据包的目的不同,可以在不同层次进行网络数据包拦截,上面讲解的几种方法有的需要专门的驱动程序编写知识,有一定难度,但是可以修改驱动程序达到自己的目的,甚至可以修改数据再将其转发。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此间的年少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值