阅读:2134回复:8
利用passthru实现ARP防火墙遇到的问题~~~各位大牛支下招~~
公司需要,小弟奉命完成一个ARP防火墙。现在遇到一个很头疼的问题:
我在微软的passthru的基础上开发一个ARP防火墙。现在做最简单的一步,就是将收到的数据和发送的数据打印出来。我在MPSendPackets 和MPSend , 还有PtReceivePacket和PtReceive四个函数里面完成数据包的读取。 现在遇到的问题是: 我使用WWW.NDIS.COM中passthruEx中的FltReadPacketData函数读取数据包,我通过判断一个数据包的12~13位置的值来判断这个数据包的类型( 例如 ARP是0x08 0x06 , IP的是0x08 0x00 ) 后来实在想不出什么原因: 看了一些资料,想到会不会是设置混杂模式的原因?于是在驱网里面找了一段代码: // // 来源于网上的一段代码,将网卡设置为混杂模式 // if (OID_GEN_CURRENT_PACKET_FILTER == Oid){ RtlCopyMemory(&aMode,InformationBuffer,sizeof(ULONG)); aMode |= NDIS_PACKET_TYPE_PROMISCUOUS; RtlCopyMemory(InformationBuffer,&aMode,sizeof(ULONG)); DbgPrint("已经将网卡设置为混杂模式\r\n"); } 加到了 MPSetInformation里面。 但是还是不能收到ARP包。想问问,我这种情况到底需要设置混杂模式么? 现在极其郁闷,想了两天,怀疑一下地方可能出错: 1,FltReadPacketData读取数据的时候出错,可能性不大,各位大牛应该都用过,有问题早发现了。 2,需要设置混杂模式,但是我的那段代码没有设置成功。 3,难道是用IMD的方式根本没法获得ARP数据包?那我就想不出还能用什么方式实现了。( 费尔防火墙使用的 NDIS HOOK , 不过好像金山11月8日出的那个ARP防火墙是用的 passthurEx 上改写的). 请各位大牛指点下,郁闷的很啊 留下联系方式 qq 75843538 mail lewis_amu@126.com msn lewis_amu@jhotmail.com 要是做做过类似东西的哥们,共享下经验。。。 。。。 |
|
沙发#
发布于:2007-11-22 11:04
再贴下 FltReadPacketData的代码 大家帮我研究下 我它没问题
//////////////////////////////////////////////////// // 读取封包中的数据 void FltReadPacketData(PNDIS_PACKET pPacket, PUCHAR lpBufferIn, ULONG nNumberToRead, PUINT lpNumberOfRead) { PUCHAR pBuf; ULONG nBufferSize; PNDIS_BUFFER pBufferDes = NULL; // 检查参数 if(pPacket == NULL || lpBufferIn == NULL || nNumberToRead == 0) { if(lpNumberOfRead != NULL) { *lpNumberOfRead = 0; return ; } } // 设置返回数据 *lpNumberOfRead = 0; // 遍历封包中的缓冲区描述表,将数据复制到用户缓冲区 pBufferDes = pPacket->Private.Head; while(pBufferDes != pPacket->Private.Tail && pBufferDes != NULL) { // 获取此缓冲区描述表的缓冲区信息 NdisQueryBufferSafe(pBufferDes, &pBuf, &nBufferSize, NormalPagePriority); if(pBuf == NULL) return; if(nNumberToRead > nBufferSize) // 复制整个缓冲区 { NdisMoveMemory(lpBufferIn + *lpNumberOfRead, pBuf, nBufferSize); nNumberToRead -= nBufferSize; *lpNumberOfRead += nBufferSize; } else // 仅复制剩下的部分 { NdisMoveMemory(lpBufferIn + *lpNumberOfRead, pBuf, nNumberToRead); *lpNumberOfRead += nNumberToRead; return; } // 下一个缓冲区描述表 pBufferDes = pBufferDes->Next; } } |
|
板凳#
发布于:2007-11-22 11:31
如果你只需要分析本机的ARP包,那不需要设为混杂模式。
如果要分析所有,那是要把网卡设为混杂模式的。 你现在的问题是收不到ARP包? 你先把收到的包的东西都打出来看看。会不会是指判断是不是ARP包的时候判断不对把收到的包都过滤掉了,以为收不到。 |
|
|
地板#
发布于:2007-11-22 12:03
我做了一个最精简的代码就在上诉函数中都加入了这样一句:
//begin 自己添加的代码 FltReadPacketData( Packet, buffer, 128 , &nReadBytes); DbgPrint("***************** PtReceive *******************"); DbgPrint("协议类型:%x\t%x" , buffer[12] , buffer[13]); DbgPrint("**********end***********"); //end 就打印出协议类型,然后用ARP -D 命令清除ARP缓存, 再ping网关 。 还是没看到任何ARP数据包的样子 |
|
地下室#
发布于:2007-11-22 13:16
你怎么知道buffer就指向mac头?
首先先把buffer 的数据前256打印出来,然后和抓报工具比较,分析一下,然后找到正确位置。切莫自以为什么就是什么的,数据说话. |
|
|
5楼#
发布于:2007-11-22 15:05
我直接把IP数据包的打印出来,都是规则的。我现在收到的两个种IP包, 一种是以6个FF开头的,还一种直接以自己的MAC地址开头的。12到13位置都是0x08 0x00 就是IP的数据包。但是怎么也收不到0x08 0x06的arp包
|
|
6楼#
发布于:2007-11-22 17:44
我也刚做的你一样的东西。。也是这个代码。。。
能收到 没问题。在PtReceive 这个函数里有包 Header 是以太头 LookAheadbuffer 是数据 以太是0800数据包就是ip的86就是arp的 可以收到 没问题 PtReceivePacket 这个函数我收到的基本是icmp 和 数据大的包。。 |
|
7楼#
发布于:2007-11-23 10:34
OK 确定了 问题了
是代码的问题 我用的是一本书的框架代码 书名叫 WINDOWS网络与通信程序设计 里面的的例子代码在读取封包的时候会出现问题。 后来一个朋友给我传了一个 "正版"的passthruEx就没问题了 可以在 www.ndis.com上面获得 感谢各位大牛 |
|
8楼#
发布于:2007-11-23 14:49
哈哈。。我还加你msn了呢
我也是那本书的代码 他的读packet包的代码有问题 把里面的while(Packet.Private.Next!=NULL) 改成do{}while(..) 就可以了 不然他不能读只有一个页的包 你的passthruEx 哪里来的啊。。我记得原来找到过。改乱了 找不到原版的。后来找不到了。。www.ndis.com打不开啊。郁闷 |
|