lewislau
驱动牛犊
驱动牛犊
  • 注册日期2006-05-12
  • 最后登录2011-04-18
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望28点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:2135回复:8

利用passthru实现ARP防火墙遇到的问题~~~各位大牛支下招~~

楼主#
更多 发布于:2007-11-22 11:00
公司需要,小弟奉命完成一个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    
      要是做做过类似东西的哥们,共享下经验。。。 。。。
lewislau
驱动牛犊
驱动牛犊
  • 注册日期2006-05-12
  • 最后登录2011-04-18
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望28点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
    }
}
kgdiwss
驱动牛犊
驱动牛犊
  • 注册日期2005-11-30
  • 最后登录2009-02-11
  • 粉丝2
  • 关注0
  • 积分655分
  • 威望89点
  • 贡献值0点
  • 好评度65点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-11-22 11:31
如果你只需要分析本机的ARP包,那不需要设为混杂模式。
如果要分析所有,那是要把网卡设为混杂模式的。
你现在的问题是收不到ARP包?
你先把收到的包的东西都打出来看看。会不会是指判断是不是ARP包的时候判断不对把收到的包都过滤掉了,以为收不到。
bbs.80dnst.com -- 驱动/逆向
lewislau
驱动牛犊
驱动牛犊
  • 注册日期2006-05-12
  • 最后登录2011-04-18
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望28点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
地板#
发布于: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数据包的样子
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地下室#
发布于:2007-11-22 13:16
你怎么知道buffer就指向mac头?

首先先把buffer 的数据前256打印出来,然后和抓报工具比较,分析一下,然后找到正确位置。切莫自以为什么就是什么的,数据说话.
走走看看开源好 Solaris vs Linux
lewislau
驱动牛犊
驱动牛犊
  • 注册日期2006-05-12
  • 最后登录2011-04-18
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望28点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-11-22 15:05
我直接把IP数据包的打印出来,都是规则的。我现在收到的两个种IP包,  一种是以6个FF开头的,还一种直接以自己的MAC地址开头的。12到13位置都是0x08  0x00  就是IP的数据包。但是怎么也收不到0x08 0x06的arp包
yellowzzp
驱动小牛
驱动小牛
  • 注册日期2007-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1015分
  • 威望131点
  • 贡献值0点
  • 好评度117点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-11-22 17:44
我也刚做的你一样的东西。。也是这个代码。。。
能收到 没问题。在PtReceive 这个函数里有包
Header 是以太头
LookAheadbuffer 是数据  以太是0800数据包就是ip的86就是arp的 可以收到
没问题
PtReceivePacket 这个函数我收到的基本是icmp 和 数据大的包。。
lewislau
驱动牛犊
驱动牛犊
  • 注册日期2006-05-12
  • 最后登录2011-04-18
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望28点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-11-23 10:34
OK   确定了  问题了
是代码的问题
我用的是一本书的框架代码  书名叫 WINDOWS网络与通信程序设计
里面的的例子代码在读取封包的时候会出现问题。
后来一个朋友给我传了一个 "正版"的passthruEx就没问题了

可以在 www.ndis.com上面获得
感谢各位大牛
yellowzzp
驱动小牛
驱动小牛
  • 注册日期2007-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1015分
  • 威望131点
  • 贡献值0点
  • 好评度117点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-11-23 14:49
哈哈。。我还加你msn了呢
我也是那本书的代码
他的读packet包的代码有问题 把里面的while(Packet.Private.Next!=NULL)
改成do{}while(..) 就可以了
不然他不能读只有一个页的包

你的passthruEx 哪里来的啊。。我记得原来找到过。改乱了 找不到原版的。后来找不到了。。www.ndis.com打不开啊。郁闷
游客

返回顶部