遍历协议链表ndisProtocolList

遇到一个样本“搞”网络协议TCPIP的一些处理函数,刚开始半天对着汇编看半天感觉数据结构对不上,就拿起ida打开ndis.sys看了下NdisRegisterProtocol的内部实现。发现确实不一样,我想应该是该样本针对的系统不一样,于是就写了个demo.

/*
只在win7 32 sp1 上测试有效,其他系统版本可能因为内部数据结构差异,存在问题.
具体的系统版本数据结构详细,可以参看NdisRegisterProtocol的内部实现
*/

VOID mBindAdapterHandler(PNDIS_STATUS status,NDIS_HANDLE BindContext,PUNICODE_STRING DeviceName,PVOID SystemSpecific1,PVOID SystemSpecific2)
{
}

VOID mUnbindAdapterHandler(PNDIS_HANDLER,NDIS_HANDLE,NDIS_HANDLE)
{
}

NTSTATUS mReceiveHandler(NDIS_HANDLE ProtocolBindingContext,NDIS_HANDLE MacReceiveContext,PVOID HeaderBuffer,
                         UINT HeaderBufferSize,PVOID LookAheadBuffer,UINT LookaheadBufferSize,UINT PacketSize)
{
}

VOID mCloseAdapterCompleteHandler(NDIS_HANDLE ProtocolBindingContext,NDIS_STATUS status)
{
}

VOID mOpenAdapterCompleteHandler(NDIS_HANDLE ProtocolBindingContext,NDIS_STATUS   Status,NDIS_STATUS OpenErrorStatus)
{
}

VOID mRequestCompleteHandler(NDIS_HANDLE ProtocolBindingContext,PNDIS_REQUEST NdisRequest,NDIS_STATUS Status)
{
}

VOID mResetCompleteHandler(NDIS_HANDLE ProtocolBindingContext,NDIS_STATUS Status)
{
}

VOID mStatusHandler(NDIS_HANDLE ProtocolBindingContext,NDIS_STATUS GeneralStatus,PVOID StatusBuffer,UINT statusBufferSize)
{
}

VOID mStatusCompleteHandler(NDIS_HANDLE ProtocolBindingContext)
{
}


PNDIS_HANDLE EnumRegisteredProtocol()
{
      ULONG                             index=0;
      UNICODE_STRING                    DestinationString;
      NDIS_HANDLE                       NdisProtocolHandle,temp=NULL;
      NDIS_STATUS                          status;
      NDIS_PROTOCOL_CHARACTERISTICS     ProtocolCharacteristics;
      PVOID                             funcs[13];
/*
      RECEIVE_PACKET_HANDLER            ReceivePacketHandler;
      BIND_HANDLER                      mBindHandler;
      UNBIND_HANDLER                    mUnbindHandler;
      PNP_EVENT_HANDLER                 PnpEventHandler;
      UNLOAD_PROTOCOL_HANDLER           mUnloadhanler;
      
      PVOID                             ReservedHandler[4];

      CO_SEND_COMPLETE_HANDLER          mCoSendCompleteHandler;
      CO_STATUS_HANDLER                 mCoStatusHandler;
      CO_RECEIVE_PACKET_HANDLER         mCoReceivePacketHandler;
      CO_AF_REGISTER_NOTIFY_HANDLER     mCoAfRegisterNotifyHandler;
*/


      status=STATUS_SUCCESS;
      NdisProtocolHandle=NULL;
      memset(&ProtocolCharacteristics,0,0x6c);
      RtlInitUnicodeString(&ProtocolCharacteristics.Name,KAPERSKY);

      ProtocolCharacteristics.MajorNdisVersion=0x5;
      ProtocolCharacteristics.MinorNdisVersion=0x0;
      //ProtocolCharacteristics.Name.Length=DestinationString.Length;
      //ProtocolCharacteristics.Name.Buffer=DestinationString.Buffer;
      ProtocolCharacteristics.BindAdapterHandler=mBindAdapterHandler;
      ProtocolCharacteristics.UnbindAdapterHandler=mUnbindAdapterHandler;
      ProtocolCharacteristics.ReceiveHandler=mReceiveHandler;
      ProtocolCharacteristics.CloseAdapterCompleteHandler=mCloseAdapterCompleteHandler;
      ProtocolCharacteristics.OpenAdapterCompleteHandler=mOpenAdapterCompleteHandler;
      ProtocolCharacteristics.RequestCompleteHandler=mRequestCompleteHandler;
      ProtocolCharacteristics.StatusHandler=mStatusHandler;
      ProtocolCharacteristics.StatusCompleteHandler=mStatusCompleteHandler;

     // *(BIND_HANDLER*)((ULONG)&ProtocolCharacteristics+0x38+0x4)=mBindAdapterHandler;
     // *(UNBIND_HANDLER*)((ULONG)&ProtocolCharacteristics+0x38+0x8)=mUnbindAdapterHandler;
      NdisRegisterProtocol(&status,&NdisProtocolHandle,&ProtocolCharacteristics,0x6c);
      if(STATUS_SUCCESS==status)
      {
             //KdPrint(("addr of ProtocolCharacteristics.MajorVersion is 0x%x\n",ProtocolCharacteristics.MajorNdisVersion));
             KdPrint(("begin to enum the ndisProtocolList.\n"));
             if(NdisProtocolHandle!=NULL)
             {
                    temp=NdisProtocolHandle;
                    do
                    {  
                        KdPrint(("ProtocolDriverHandle is 0x%x ProtocolName is %wZ\n",(ULONG)temp,(PUNICODE_STRING)((ULONG)temp+0x24)));
              
	                //KdPrint(("data NdisProtocolHandle+0x8 0x%x\n",*(ULONG*)((ULONG)NdisProtocolHandle+0x8)));
	                temp=(NDIS_HANDLE)*(ULONG*)((ULONG)temp+0x8);//下一个ProtocolHandle
                        if(temp==NULL)
                           KdPrint(("ndisProtocolList is a SingleLinkedList!\n"));
                    }while(temp!=NULL&&temp!=NdisProtocolHandle);
	            NdisDeregisterProtocol(&status,NdisProtocolHandle);//注销协议
             }

      }
      else
      {
             KdPrint(("RegisterProtocol fails,error is 0x%x\n",status));
       }
      return NULL;
}

 

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值