iihacker
论坛版主
论坛版主
  • 注册日期2010-01-07
  • 最后登录2017-08-16
  • 粉丝5
  • 关注8
  • 积分377分
  • 威望1941点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3218回复:2

ARP欺骗本机失败-求解答

楼主#
更多 发布于:2011-03-10 10:33
我的思路: 在MpSend中拦截ARP request 包,然后自己创建一个reply回应包,并且把这个回应包插入到链表中。然后继续ARP request 包的发送(使其发送成功),并在PtSendCompelete中触发链表的事件。 说明:链表在创建的一个事先的线程中出链表,并使用NdisMIndicateReceivePacket向上层传递我们的ARP reply回应包。

现象:arp -a  看见相应的IP的MAC地址为00 00 00 00 00,或者没有相应的IP项。使用抓包软件可以看到正确的我们伪造的ARP reply包。


如果把上面的NdisMIndicateReceivePacket改为NDISSend, ARP欺骗是成功的


关键代码;


                        pArpContent=ExAllocatePoolWithTag(NonPagedPool,sizeof(MACDATA),'t');
                        pArpContent->packetsize=sizeof(ARPPACKET);
                        pArpContent->pcontent=pSendBuffer;
                        pArpContent->pAdapt=pAdapt;

pSendBuffer为我修改好的ARP reply 的buffer :


在PtSendComplete中 代码:KeSetEvent(&g_RedirectSendEvent,IO_NO_INCREMENT,FALSE);


线程代码:




    while (TRUE)
    {

        KeWaitForSingleObject(&g_RedirectSendEvent,Executive,KernelMode,0,0);


        if (g_bEXIT)
        {
            goto   InitWorkThreAd_end;
        }
        while (TRUE)
        {
            if (IsListEmpty(&RedirectmacLinkListHead))
            {
                break;
            }
            else
            {                
                pEntry=RemoveTailList(&RedirectmacLinkListHead);

                pmacdata=(PMACDATA)pEntry;


                NdisAllocatePacket(&Status,
                    &MyPacket,
                    pmacdata->pAdapt->mySendPacketPoolHandle);
                if( Status != NDIS_STATUS_SUCCESS )
                    break;

                NdisAllocateBuffer( &Status,
                    &pNdisBuffer,
                    pmacdata->pAdapt->mySendBufferPoolHandle,
                    pmacdata->pcontent,
                    pmacdata->packetsize
                    );
                if( Status != NDIS_STATUS_SUCCESS )
                    break;

                SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved);
                SendRsvd->OriginalPkt = NULL;


                NdisChainBufferAtFront(MyPacket,pNdisBuffer);

                //NdisSend(&Status,
                //    pmacdata->pAdapt->BindingHandle,
                //    MyPacket);
                if (pmacdata->pAdapt->MiniportHandle)
                {
                    NdisMIndicateReceivePacket(pmacdata->pAdapt->MiniportHandle, &MyPacket, 1);
                                        
                }
                

                if( Status != NDIS_STATUS_SUCCESS )
                    break;


            }        
        }





说明:把线程代码中的NdisMIndicateReceivePacket换为NdisSend() ARP欺骗成功。




使用的工具。 ping 命令 arp -a 命令

附件是使用wareshark抓包工具抓的包
附件名称/大小 下载次数 最后更新
arp.rar (1KB)  5 2011-03-10 10:33
NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
iihacker
论坛版主
论坛版主
  • 注册日期2010-01-07
  • 最后登录2017-08-16
  • 粉丝5
  • 关注8
  • 积分377分
  • 威望1941点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2011-07-05 21:08
回 1楼(feifei12021) 的帖子
已经过去好久了。当时忘了改MAC地址
NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
feifei12021
驱动牛犊
驱动牛犊
  • 注册日期2011-05-21
  • 最后登录2011-07-03
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2011-07-02 19:23
学习的,我也不是太懂
feifei
游客

返回顶部