阅读:1494回复:3
关于混杂模式的问题,大家帮帮忙。(35分)
我用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] |
|
沙发#
发布于:2005-06-03 10:14
[quote]NdisRequest参数里的BindHandle就是指向Ndis_Open_Block结构的. 我在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协议就行了。 |
|
板凳#
发布于:2005-06-03 00:29
NdisRequest参数里的BindHandle就是指向Ndis_Open_Block结构的. 我在HookRequestComplete里有释放过Prequest申请的内存。但是我用SoftIce在HookRequestComplete里设置断点,发现还没执行到那就挂了。 NdisRequest执行完后就出现Break due to page fault错误。 为什么不要再送给TCPIP了?我HOOK是TCPIP协议的函数。所以希望通过他的BINDHandle发送设置混杂模式。 我还有一个问题是是不是在一个驱动中设置了网卡的混杂模式,能产生全局效应?也就是说,是不是所有的驱动或者应用都可以接受其他主机的包? |
|
地板#
发布于:2005-06-02 21:52
NdisRequest参数里的BindHandle就是指向Ndis_Open_Block结构的.
你的HookRequestComplete函数里对你自己发送的Request做特殊处理了吗?不要再送给tcp/ip了,如果送了,肯定会出问题。 而且看看蓝屏时候的信息,bugcheck的值,产生错误的指令,所引用的内存的值,以及当时stack,会告诉你很多信息。如果长期做做驱动,要逐渐学会分析蓝屏,可以用windbg看dmp文件分析,具体见windbg的帮助 |
|