阅读:3344回复:2
ARP欺骗本机失败-求解答
我的思路: 在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抓包工具抓的包 |
|
|
沙发#
发布于:2011-07-02 19:23
学习的,我也不是太懂
|
|
|
板凳#
发布于:2011-07-05 21:08
回 1楼(feifei12021) 的帖子
已经过去好久了。当时忘了改MAC地址 |
|
|