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

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

 2008-01-19 13:11:36 来源:WEB开发网   
核心提示:通常用户都知道,NDIS协议驱动程序是通过填写一张NDIS_PROTOCOL_CHARACTERISTICS的表,基于NDIS(网络驱动接口标准)包拦截技术,并调用NDIS API函数NdisRegisterProtocol进行注册,现在我们来关注一下NDIS_PROTOCOL_CHARACTERISTICS这张表,那

通常用户都知道,NDIS协议驱动程序是通过填写一张NDIS_PROTOCOL_CHARACTERISTICS的表,并调用NDIS API函数NdisRegisterProtocol进行注册。现在我们来关注一下NDIS_PROTOCOL_CHARACTERISTICS这张表,这张表中存有所有协议驱动程序与底层的派发函数的入口。如SendHandler,ReceiveHandler,BindAdapterHandler等,

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

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

struct_NDIS_PROTOCOL_BLOCK
  {
  PNDIS_OPEN_BLOCKOpenQueue;//queueofopensforthisprotocol
  REFERENCERef;//containsspinlockforOpenQueue
  UINTLength;//ofthisNDIS_PROTOCOL_BLOCKstruct
  NDIS50_PROTOCOL_CHARACTERISTICSProtocolCharacteristics;//handleraddresses
  struct_NDIS_PROTOCOL_BLOCK*NextProtocol;//Linktonext
  ULONGMaxPatternSize;
  #ifdefined(NDIS_WRAPPER)
  //
  //Protocolfilters
  //
  struct_NDIS_PROTOCOL_FILTER*ProtocolFilter[NdisMediumMax+1];
  WORK_QUEUE_ITEMWorkItem;//UsedduringNdisRegisterProtocolto
  //notifyprotocolsofexistingdrivers.
  KMUTEXMutex;//ForserializationofBind/Unbindrequests
  PKEVENTDeregEvent;//UsedbyNdisDeregisterProtocol
  #endif
  };
  typedefstruct_NDIS_PROTOCOL_BLOCKNDIS_PROTOCOL_BLOCK,*PNDIS_PROTOCOL_BLOCK;
  EXPORT
  VOID
  NdisRegisterProtocol(
  OUTPNDIS_STATUSStatus,
  OUTPNDIS_PROTOCOL_BLOCKNdisProtocolHandle,/*注意NDIS_HANDLE所指向的就是PNDIS_PROTOCOL_BLOCK的结构,不要有什么怀疑。*/
  INPNDIS_PROTOCOL_CHARACTERISTICSProtocolCharacteristics,
  INUINTCharacteristicsLength
  );

1 2 3  下一页

Tags:基于 NDIS 网络

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