基于ndis(网络驱动接口标准)包拦截技术

基于ndis(网络驱动接口标准)包拦截技术

ID:9705208

大小:62.00 KB

页数:8页

时间:2018-05-05

基于ndis(网络驱动接口标准)包拦截技术_第1页
基于ndis(网络驱动接口标准)包拦截技术_第2页
基于ndis(网络驱动接口标准)包拦截技术_第3页
基于ndis(网络驱动接口标准)包拦截技术_第4页
基于ndis(网络驱动接口标准)包拦截技术_第5页
资源描述:

《基于ndis(网络驱动接口标准)包拦截技术》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、基于NDIS(网络驱动接口标准)包拦截技术~教育资源库  通常用户都知道,NDIS协议驱动程序是通过填写一张NDIS_PROTOCOL_CHARACTERISTICS的表,并调用NDISAPI函数NdisRegisterProtocol进行注册。现在我们来关注一下NDIS_PROTOCOL_CHARACTERISTICS这张表,这张表中存有所有协议驱动程序与底层的派发函数的入口。如SendHandler,ReceiveHandler,BindAdapterHandler等,  当网卡有数据包进入时,会

2、通过表中ReceiveHandle或ReceivePacketHandler通知协议驱动程序有一个该协议的数据包进入,反之协议驱动程序是通过SendHandler或SendPacketsHandler函数向网卡驱动发送数据包到网络上去的,有人会奇怪程序中明明不是调用NdisSend或NdisSendPackets函数发送的吗?没错,是这样的,但是你可以看一下NDIS。H的头文件里对这两个函数的定义就知道了,他们都是一个宏定义实际并通过这表中SendHandler或SendPacketsHandler发

3、送的。  现在我们所要做的事情应该很清楚了,只要我们能够将每一个协议程序所填写的NDIS_PROTOCOL_CHARACTERISTICS表里的派发函数指向自己的函数,我们就能成功的对数据包进行拦截。那么每个协议驱动程序的这张表到底存放在那里呢?看下面的对NdisRegisterProtocol重新给出的原型就很明白了。struct_NDIS_PROTOCOL_BLOCK  {  PNDIS_OPEN_BLOCKOpenQueue;//queueofopensforthisprotocol  REFE

4、RENCERef;//containsspinlockforOpenQueue  UINTLength;//ofthisNDIS_PROTOCOL_BLOCKstruct  NDIS50_PROTOCOL_CHARACTERISTICSProtocolCharacteristics;//handleraddresses  struct_NDIS_PROTOCOL_BLOCK*NextProtocol;//Linktonext  ULONGMaxPatternSize;  #ifdefined(NDIS

5、_ediumMax+1];  UTEXMutex;//ForserializationofBind/Unbindrequests  PKEVENTDeregEvent;//UsedbyNdisDeregisterProtocol  #endif  };  typedefstruct_NDIS_PROTOCOL_BLOCKNDIS_PROTOCOL_BLOCK,*PNDIS_PROTOCOL_BLOCK;  EXPORT  VOID  NdisRegisterProtocol(  OUTPNDIS_ST

6、ATUSStatus,  OUTPNDIS_PROTOCOL_BLOCKNdisProtocolHandle,/*注意NDIS_HANDLE所指向的就是PNDIS_PROTOCOL_BLOCK的结构,不要有什么怀疑。*/  INPNDIS_PROTOCOL_CHARACTERISTICSProtocolCharacteristics,  INUINTCharacteristicsLength  );  NDIS_PROTOCOL_BLOCK(协议表)是NDIS维护所有系统中已注册协义的单向链接表。字段

7、NextProtocol指向下一个协议表。  庆幸的是,当我们注册一新的协议时,NDIS总是会把新注册的协义放在链表的头并返回这张表,所以只要我们注册一个新的协议通过新协议注册返回的链表头就可以轻而易举的遍历系统中所有协议表.现在我们所希望得到的每个协议的NDIS_PROTOCOL_CHARACTERISTICS表就放在我们面前了,如何勾挂表中的派发函数,我想不必多说了吧。顺便说一句NDISREGISTERPROTOCOL为NDIS_PROTOCOL_BLOCK所分配的内存是NonPagedPool类

8、型的。对于核心DRIVER来说,核心区内存是一个线性的内存区,所有核心DRIVER是可以随便访问核心内存区的任意地址。所要注意的是不同IRQL级别下对分页和非分页内存。  有人会问这样就行了吗?真的拦截下来了吗?如果有那位仁兄心急现在就写程序的话,准会失望的,因为他会发现结果什么东西都没拦截到或偶而会拦截到一些数据包。为什么?  因为NDIS网卡驱动和协议驱动在发送和接收到数居时并不是调用PNDIS_OPEN_BLOCK->ProtocolChar

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。