planet125
驱动牛犊
驱动牛犊
  • 注册日期2005-05-16
  • 最后登录2007-08-07
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1492回复:3

关于混杂模式的问题,大家帮帮忙。(35分)

楼主#
更多 发布于:2005-06-02 17:50
我用GJP的方法设置了自己的NIDSHOOK。

但是我想通过HOOK监听局域网所有的包。因此需要设置混杂模式。

按照论坛里的方法设置后,为什么总是蓝屏?我用SOFTICE查看了一下,每次一到NdisRequest函数执行完立即蓝屏。

我想问一下,NdisRequest参数里的BindHandle是不是就是指向Ndis_Open_Block结构的?为什么会蓝屏?

部分代码如下:
        PNDIS_OPEN_BLOCK pNdisOpenBlock;

       NDIS_STATUS myStatus;
        PNDIS_REQUEST pRequest;
        ULONG OidData = NDIS_PACKET_TYPE_PROMISCUOUS;

pNdisOpenBlock = ((PNDIS_OPEN_BLOCK *)ProtocolContent)[0];

while(pNdisOpenBlock)
{
//__asm int 3;
if( !IsWan )
{
       HookNdisFunc(HookProtocolSend,(PVOID *)&pNdisOpenBlock->SendHandler,pNdisOpenBlock,ProtocolContent);
HookNdisFunc(HookProtocolReceive,(PVOID *)&pNdisOpenBlock->PostNt31ReceiveHandler,pNdisOpenBlock,ProtocolContent);
}
else
{
HookNdisFunc(HookProtocolWanSend,(PVOID *)&pNdisOpenBlock->WanSendHandler,pNdisOpenBlock,ProtocolContent);
HookNdisFunc(HookWanReceive,(PVOID *)&pNdisOpenBlock->WanReceiveHandler,pNdisOpenBlock,ProtocolContent);
}

HookNdisFunc(HookProtocolReceive,(PVOID *)&pNdisOpenBlock->ReceiveHandler,pNdisOpenBlock,ProtocolContent);
HookNdisFunc(HookProtocolReceivePacket,(PVOID *)&pNdisOpenBlock->ReceivePacketHandler,pNdisOpenBlock,ProtocolContent);
HookNdisFunc(HookProtocolSendPackets,(PVOID *)&pNdisOpenBlock->SendPacketsHandler,pNdisOpenBlock,ProtocolContent);
HookNdisFunc(HookRequestComplete,(PVOID *)&pNdisOpenBlock->RequestCompleteHandler,pNdisOpenBlock,ProtocolContent)
///////////////////////////////////////////////////////////////////////////
if(!RtlCompareUnicodeString(&pProChar->Name,&TcpipString,TRUE))
{
  myStatus = NdisAllocateMemory(&pRequest, sizeof(NDIS_REQUEST), 0, HighestAcceptableMax);
          if( myStatus != NDIS_STATUS_SUCCESS )
  {
         DbgPrint(\"Error: Can not allocate the Memory for NDIS_REQUEST!\");
  }
             else
 {
            DbgPrint(\"Success: Allocate the Memory for NDIS_REQUEST!\");
            if( pRequest == NULL )
{
           DBGPRINT(\"Can not allocate buffer for requestn\");
}
               else
{
              DbgPrint(\"Allocate buffer for requestn\");
              pRequest->RequestType = NdisRequestSetInformation;
              pRequest->DATA.SET_INFORMATION.Oid = OID_GEN_CURRENT_PACKET_FILTER;
              pRequest->DATA.SET_INFORMATION.InformationBuffer = &OidData;
              pRequest->DATA.SET_INFORMATION.InformationBufferLength = sizeof(ULONG);
              NdisRequest(&myStatus, pNdisOpenBlock,pRequest);
              if(myStatus != NDIS_STATUS_PENDING)
              {
              if(pRequest)
              {
              DBGPRINT(\"Free request.n\");
              NdisFreeMemory(pRequest, sizeof(NDIS_REQUEST), 0);
              }
              }
              else
              {
              DbgPrint(\"myStatus == NDIS_STATUS_PENDING\");
              }
              }
 }    
}
///////////////////////////////////////////////////////////////////////////
pNdisOpenBlock = pNdisOpenBlock->ProtocolNextOpen;    
}


[编辑 -  6/2/05 by  planet125]
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-02 21:52
NdisRequest参数里的BindHandle就是指向Ndis_Open_Block结构的.

你的HookRequestComplete函数里对你自己发送的Request做特殊处理了吗?不要再送给tcp/ip了,如果送了,肯定会出问题。

而且看看蓝屏时候的信息,bugcheck的值,产生错误的指令,所引用的内存的值,以及当时stack,会告诉你很多信息。如果长期做做驱动,要逐渐学会分析蓝屏,可以用windbg看dmp文件分析,具体见windbg的帮助
planet125
驱动牛犊
驱动牛犊
  • 注册日期2005-05-16
  • 最后登录2007-08-07
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-03 00:29
NdisRequest参数里的BindHandle就是指向Ndis_Open_Block结构的.

你的HookRequestComplete函数里对你自己发送的Request做特殊处理了吗?不要再送给tcp/ip了,如果送了,肯定会出问题。

而且看看蓝屏时候的信息,bugcheck的值,产生错误的指令,所引用的内存的值,以及当时stack,会告诉你很多信息。如果长期做做驱动,要逐渐学会分析蓝屏,可以用windbg看dmp文件分析,具体见windbg的帮助


我在HookRequestComplete里有释放过Prequest申请的内存。但是我用SoftIce在HookRequestComplete里设置断点,发现还没执行到那就挂了。
NdisRequest执行完后就出现Break due to page fault错误。

为什么不要再送给TCPIP了?我HOOK是TCPIP协议的函数。所以希望通过他的BINDHandle发送设置混杂模式。

我还有一个问题是是不是在一个驱动中设置了网卡的混杂模式,能产生全局效应?也就是说,是不是所有的驱动或者应用都可以接受其他主机的包?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-06-03 10:14
[quote]NdisRequest参数里的BindHandle就是指向Ndis_Open_Block结构的.

你的HookRequestComplete函数里对你自己发送的Request做特殊处理了吗?不要再送给tcp/ip了,如果送了,肯定会出问题。

而且看看蓝屏时候的信息,bugcheck的值,产生错误的指令,所引用的内存的值,以及当时stack,会告诉你很多信息。如果长期做做驱动,要逐渐学会分析蓝屏,可以用windbg看dmp文件分析,具体见windbg的帮助


我在HookRequestComplete里有释放过Prequest申请的内存。但是我用SoftIce在HookRequestComplete里设置断点,发现还没执行到那就挂了。
NdisRequest执行完后就出现Break due to page fault错误。

为什么不要再送给TCPIP了?我HOOK是TCPIP协议的函数。所以希望通过他的BINDHandle发送设置混杂模式。

我还有一个问题是是不是在一个驱动中设置了网卡的混杂模式,能产生全局效应?也就是说,是不是所有的驱动或者应用都可以接受其他主机的包? [/quote]
1.是死在NdisRequest里面,还是返回的时候死的?如果参数没有错误,就要仔细分析汇编代码了
2.如果你自己构造的request,完成函数里,当然不能送给tcp/ip里,因为它不知道怎么处理
3.你最好自己做个试验,因为ddk里说的也并不明确。设置混杂模式
后,网卡肯定是收到了网上所有的包,但是送给协议的时候,是送给
所有的协议,还是只送给设置了混杂模式的协议,需要自己去试验了。
4。你的需求是什么,做防火墙不需要这个功能,如果做sniffer的
功能,写一个标准的protocol协议就行了。
游客

返回顶部