69,371
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <pcap.h>
#include "fake.h"
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib, "Packet.lib")
#pragma comment(lib, "wsock32.lib")//hton()函数用到
void Creatpack();//构造包声明
void fill_mac_data();//填充mac部分声明
void fill_ip_data();//填充ip部分声明
void fill_icmp_data();//填充icmp部分声明
u_short checksum(u_short *buffer, int size);//检验和函数
int main()
{
pcap_t *fp;//打开网卡后返回的指针
pcap_if_t *alldevs;//接口列表结点指针
pcap_if_t *d;
char errbuf[PCAP_ERRBUF_SIZE];
int k=0;//总网卡数k
int inum;//要欲输入的网卡号
u_int num_pack=0;//发包数量
u_int j=0;
time_t lt;//时间相关
struct tm *ltime;
char timestr[30];
/* 取得所有网卡列表*/
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s ", errbuf);
exit(1);
}
/* 输出网卡列表*/
for(d=alldevs; d; d=d->next)//直到d指向NULL
printf("%d. %s ", ++k, d->name);//网卡名,网卡数k加1
/* 选择欲抓包网卡号*/
printf("Enter the interface number (1-%d):",k);
scanf("%d", &inum);
if(inum < 1 || inum > k)//输入网卡号错的话跳出
{
printf(" Interface number out of range. ");
pcap_freealldevs(alldevs);
return -1;
}
for(d=alldevs, k=0; k< inum-1 ;d=d->next, k++);//进行网卡选择
/* 打开网卡 */
if ((fp = pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture. It doesn't matter in this case
1, // promiscuous mode (nonzero means promiscuous)
1000, // read timeout
errbuf // error buffer
)) == NULL)
{
fprintf(stderr," Unable to open the adapter. %s is not supported by WinPcap ", d->name);
return 2;
}
/* 选择要发包的数量*/
printf("Enter the packet number will send :");
scanf("%d", &num_pack);
Creatpack();
/* 进行发包 */
while(j<num_pack)
{
if (pcap_sendpacket(fp, // Adapter
packet, // buffer with the packet
100 // size
) != 0)
{
fprintf(stderr," Error sending the packet: ", pcap_geterr(fp));
return 3;
}
/* 获得时间*/
lt = time(NULL);//日历日间
ltime=localtime(<);//日历时间转化为本地时间
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);//时间显示格式
printf("No: %-3d time:%s ",j+1,timestr);
j++;
}
printf("sending %d packet successfully ! ",num_pack);
pcap_close(fp);
system("pause");
return 0;
}
void Creatpack()
{
memset( packet,0, sizeof(packet) );
fill_mac_data();
fill_ip_data();
fill_icmp_data();
}
void fill_mac_data()
{
MacHeadr.type = htons(0x0800);//IP包类型
//begin//////////////////////////////////////////////////////////////////////////////////
//begin//////////////////////////////////////////////////////////////////////////////////
//begin//////////////////////////////////////////////////////////////////////////////////
//目标mac地址,下面的意思为00:E0:4C:04:8E:E7
MacHeadr.dmac[0] = 0x00;
MacHeadr.dmac[1] = 0xE0;
MacHeadr.dmac[2] = 0x4C;
MacHeadr.dmac[3] = 0x04;
MacHeadr.dmac[4] = 0x8E;
MacHeadr.dmac[5] = 0xE7;
//源mac地址
MacHeadr.smac[0] = 0x00;
MacHeadr.smac[1] = 0x00;
MacHeadr.smac[2] = 0x00;
MacHeadr.smac[3] = 0x00;
MacHeadr.smac[4] = 0x00;
MacHeadr.smac[5] = 0x0F;
//end//////////////////////////////////////////////////////////////////////////////////
//end//////////////////////////////////////////////////////////////////////////////////
//end//////////////////////////////////////////////////////////////////////////////////
memcpy(packet,&MacHeadr,sizeof(MacHeadr));
}
void fill_ip_data()
{
pIpHeader=&IpHeader;
//begin//////////////////////////////////////////////////////////////////////////////////
//begin//////////////////////////////////////////////////////////////////////////////////
//begin//////////////////////////////////////////////////////////////////////////////////
//目标ip地址,下面的意思是192.168.0.81
IpHeader.daddr[0] = 192;
IpHeader.daddr[1] = 168;
IpHeader.daddr[2] = 0;
IpHeader.daddr[3] = 81;
//源ip地址
IpHeader.saddr[0] = 192;
IpHeader.saddr[1] = 168;
IpHeader.saddr[2] = 0;
IpHeader.saddr[3] = 114;
//end//////////////////////////////////////////////////////////////////////////////////
//end//////////////////////////////////////////////////////////////////////////////////
//end//////////////////////////////////////////////////////////////////////////////////
IpHeader.flags_fo = htons(0);
IpHeader.identification = htons(0x3456);
IpHeader.proto = IPPROTO_ICMP;
IpHeader.tlen = htons(60);//IP头:20+ICMP头:8+ICMP请求包固定数据32,
//错的话对方不会发回应包
IpHeader.tos = 0;
IpHeader.ttl = 128;
IpHeader.ver_ihl = 0x45;
IpHeader.crc = 0;
IpHeader.crc = checksum((u_short *)pIpHeader, sizeof(IpHeader));//已经是网络字符序了
memcpy(packet+sizeof(MacHeadr),&IpHeader,sizeof(IpHeader));
}
void fill_icmp_data()
{
pIcmpHeader=&IcmpHeader;
IcmpHeader.i_type = 8;
IcmpHeader.i_code = 0;
IcmpHeader.i_id = htons(0x2);;
IcmpHeader.i_seq = htons(0);
IcmpHeader.i_cksum = 0;
IcmpHeader.i_cksum = checksum((u_short *)pIcmpHeader,sizeof(IcmpHeader) ); //已经是网络字符序了
memcpy(packet+sizeof(MacHeadr)+sizeof(IpHeader),&IcmpHeader,sizeof(IcmpHeader));
}
u_short checksum(u_short *buffer, int size) {
unsigned long cksum=0;
while(size >1) {
cksum+=*buffer++;
size -=sizeof(u_short);
}
if(size ) {
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (u_short)(~cksum);
}
上面这段程序可以给任意IP地址发任意内容,并任意填写发送方IP地址和MAC地址#!/usr/bin/perl -w
use Net::RawIP;
use strict;
my $src=$ARGV[0] or &usage(); //src获取第一个参数,设为源IP地址
my $dst=$ARGV[1] or &usage(); //dst获取第二个参数,设为目的地址
my $str=$ARGV[2] or &usage(); //str获取第三个参数,设为数据
my $rawpkt=new Net::PawIP(
{
ip=>
{
saddr=>$src,
daddr=>$dst
},
udp=>{}
};
$rawpkt->set({ip=>{
saddr=>$src, //源地址
daddr=>$dst}, //目的地址
udp=>{
source=>10001,
dest=>53,
data=>$str, //数据
}
});
$rawpkt->send();
print'[+]Sent'.length($str)."bytes of data...\n";
exit 0;
sub usage()
{
die "usage: $0 <src> <dst> <str>";
}
简单的说就是把自己的数据包的源地址、目的地址都换掉,可以自己设置,个人理解。
#!/usr/bin/perl -w
use Net::RawIP;
use strict;
my $src=$ARGV[0] or &usage();
my $dst=$ARGV[1] or &usage();
my $str=$ARGV[2] or &usage();
my $rawpkt=new Net::PawIP(
{
ip=>
{
saddr=>$src,
daddr=>$dst
},
udp=>{}
};
$rawpkt->set({ip=>{
saddr=>$src,
daddr=>$dst},
udp=>{
source=>10001,
dest=>53,
data=>$str,
}
});
$rawpkt->send();
print'[+]Sent'.length($str)."bytes of data...\n";
exit 0;
sub usage()
{
die "usage: $0 <src> <dst> <str>";
}
程序以书本为准!