基于NDIS(网络驱动接口标准)包拦截技术
2008-01-19 13:11:36 来源:WEB开发网 struct_NDIS_OPEN_BLOCK
{
PNDIS_MAC_BLOCKMacHandle;//pointertoourMAC
NDIS_HANDLEMacBindingHandle;//contextwhencallingMacXXfuncs
PNDIS_ADAPTER_BLOCKAdapterHandle;//pointertoouradapter
PNDIS_PROTOCOL_BLOCKProtocolHandle;//pointertoourprotocol
NDIS_HANDLEProtocolBindingContext;//contextwhencallingProtXXfuncs
PNDIS_OPEN_BLOCKAdapterNextOpen;//usedbyadapter''''sOpenQueue
PNDIS_OPEN_BLOCKProtocolNextOpen;//usedbyprotocol''''sOpenQueue
PFILE_OBJECTFileObject;//createdbyoperatingsystem
BOOLEANClosing;//TRUEwhenremovingthisstruct
BOOLEANUnloading;//TRUEwhenprocessingunload
BOOLEANNoProtRsvdOnRcvPkt;//Reflecttheprotocol_options
NDIS_HANDLECloseRequestHandle;//0indicatesaninternalclose
KSPIN_LOCKSpinLock;//guardsClosing
PNDIS_OPEN_BLOCKNextGlobalOpen;
//
//TheseareoptimizationsforgettingtoMACroutines.Theyarenot
//necessary,butareheretosaveadereferencethroughtheMACblock.
//
SEND_HANDLERSendHandler;
TRANSFER_DATA_HANDLERTransferDataHandler;
//
//TheseareoptimizationsforgettingtoPROTOCOLroutines.Theyarenot
//necessary,butareheretosaveadereferencethroughthePROTOCOLblock.
//
SEND_COMPLETE_HANDLERSendCompleteHandler;
TRANSFER_DATA_COMPLETE_HANDLERTransferDataCompleteHandler;
RECEIVE_HANDLERReceiveHandler;
RECEIVE_COMPLETE_HANDLERReceiveCompleteHandler;
//
//ExtentionstotheOPEN_BLOCKsinceProduct1.
//
RECEIVE_HANDLERPostNt31ReceiveHandler;
RECEIVE_COMPLETE_HANDLERPostNt31ReceiveCompleteHandler;
//
//NDIS4.0extensions
//
RECEIVE_PACKET_HANDLERReceivePacketHandler;
SEND_PACKETS_HANDLERSendPacketsHandler;
//
//MoreNDIS3.0CachedHandlers
//
RESET_HANDLERResetHandler;
REQUEST_HANDLERRequestHandler;
//
//NeededforPnP
//
UNICODE_STRINGAdapterName;//Upcasednameoftheadapterweareboundto
};
上面的表结构可以很清楚的看到这张表是一个单向链接表,并且存放了和PNDIS_OPEN_BLOCK->ProtocolCharacteristics一样的数据收发派发函数,当第N块网卡发送数据包到第N个协议时,就会调用第N个协议与第N个网卡之间建立的NDIS_OPEN_BLOCK表里的SendHandler或SendPacketHandler。所以我们还需要对这张表里的派发函数进行处理(勾挂)。
看了很多提供数据包的拦截技术,其中最多的是编写IM DRIVER在NDIS中间层对MINIPORT(网卡驱动程序)和协议驱动程序之间的数据包进行拦截。但编写该过滤程序拦截程序非常的复杂,这里介绍一种更有效的基于NDIS包拦截技术……
那么又如何勾挂协议与网卡之间的NDIS_OPEN_BLOCK表呢。我们再回到NDIS_PROTOCOL_BLOCK这张表中,在NDIS_PROTOCOL_BLOCK表中字段PNDIS_OPEN_BLOCK OpenQueue;就是所有该协议所有NDIS_OPEN_BLOCK的表头。
通过AdapterNextOpen遍历一下,再勾挂一把。就可以顺利拦截了。
值得注意的是。
1、NDIS_OPEN_BLOCK
NDIS_PROTOCOL_BLOCK这些结构不同NDIS版本是不同的,解决方法是在windows 98和windows95下(ndis 3.1)使用windows98ddk 带的NDIS.H 里的定义在windows me下(ndis 5.0或4。0)请使用WINDOWS 98ddk里NDIS.H里的定义nt(ndis4.0)用NTDDK里的定议,以此类推,2000(ndis5.0)
2、不要重复勾挂同一个函数。
http://www.gjpsoft.com/ndishook1.c此部分为NT部分的源代码。要使用在9X下需要修改,因为没有整体分开,一些函数和头文件未给出,但不影响框架请阅读者自己修改。
更多精彩
赞助商链接