WEB开发网
开发学院网络安全安全技术 基于NDIS(网络驱动接口标准)包拦截技术 阅读

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

 2008-01-19 13:11:36 来源:WEB开发网   
核心提示: struct_NDIS_OPEN_BLOCK{PNDIS_MAC_BLOCKMacHandle;//pointertoourMACNDIS_HANDLEMacBindingHandle;//contextwhencallingMacXXfuncsPNDIS_ADAPTER_BLOCKAda

   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下需要修改,因为没有整体分开,一些函数和头文件未给出,但不影响框架请阅读者自己修改。

上一页  1 2 3 

Tags:基于 NDIS 网络

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接