Cooler_

URL extractor with PCRE

Sep 9th, 2012
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.14 KB | None | 0 0
  1. /* test by Cooler_
  2.  gcc -o code code.c -lpcre -lcurl
  3.  
  4.  ./spiderpcre www.telona.org
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <pcre.h>
  10. #include <curl/curl.h>
  11. #include <curl/easy.h>
  12.  
  13. char *parse(char *str, int start, int end);
  14. void *xmalloc(size_t size);
  15. static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data);
  16.  
  17. void help()
  18. {
  19.  puts(
  20.   "Simple Spider to parse URLs v0.01\n"
  21.   "./code url\n"
  22.   " ------------------------------------\n"
  23.   " by Cooler_ , BugSec Team , contact: c00f3r[at]gmail[dot]com\n"
  24.  );
  25. }
  26.  
  27. struct MemoryStruct {
  28.  char *memory;
  29.  size_t size;
  30. };
  31.  
  32. int main(int argc, char ** argv)
  33. {
  34.  struct MemoryStruct chunk;
  35.  
  36. // curl vars
  37.  CURL *curl_handle;  
  38.  curl_global_init(CURL_GLOBAL_ALL);
  39.  
  40.  char *url=NULL,*target=NULL,*URL=NULL;
  41.  const char *errText;
  42.  int errOffset=0,cmd=0,offset=0,count=0;
  43.  int array[6];
  44.  pcre *regex;
  45.  
  46.  if(argc<2)
  47.  {
  48.   help();    
  49.   return 0;    
  50.  }    
  51.  
  52.  if(strlen(argv[1])<256)
  53.   target=argv[1];
  54.  else
  55.  {
  56.   puts("erro no primeiro argumento");
  57.   return 0;
  58.  }
  59.  
  60.  
  61. // regex pcre
  62.  regex = pcre_compile("href=[\\S>]+", 0, &errText, &errOffset, NULL);
  63.  
  64.   if(!regex)
  65.   {
  66.    fprintf(stderr, "Erro: %s (%d)\n", errText, errOffset);
  67.    return 0;
  68.   }
  69.   else
  70.   {
  71.    fprintf(stdout,"\npegando urls de %s\n",target);
  72.  
  73.    puts("------------------\n");
  74.    chunk.memory=NULL;
  75.    chunk.size=0;  
  76.  
  77.    curl_handle=curl_easy_init();
  78.    curl_easy_setopt(curl_handle, CURLOPT_URL, target);
  79.    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION,WriteMemoryCallback);
  80.    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA,(void *)&chunk);
  81.    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.17) Gecko/2009122116 Firefox/3.0.17 ");
  82.    curl_easy_perform(curl_handle);
  83.    curl_easy_cleanup(curl_handle);
  84.  
  85.    if(chunk.memory)
  86.    {
  87.     while(1)
  88.     {
  89.      cmd=pcre_exec(regex, NULL, chunk.memory, strlen(chunk.memory), offset, 0, array, 6);
  90.       if(cmd <= 0)
  91.        break;    
  92.      url=parse(chunk.memory, array[0], array[1]);
  93.  
  94.      url+=6;
  95.      while(*url!='"')
  96.      {
  97.       fprintf(stdout,"%c",*url);
  98.       url++;
  99.      }
  100.      puts("");
  101.      offset = array[1]+1;
  102.    
  103.     }
  104.  
  105.     pcre_free(regex);
  106.    }
  107.   }
  108.  
  109.  if(chunk.size)
  110.   free(chunk.memory);
  111.  
  112.  curl_global_cleanup();
  113.  
  114.  return 0;
  115. }
  116.  
  117.  
  118. char *parse(char *str, int start, int end)
  119. {
  120.  char *word=(char *)xmalloc(sizeof(char)*2048);
  121.  int x=0;
  122.  
  123.  while(start != end)
  124.  {
  125.   word[x]=str[start];
  126.   start++,x++;
  127.  }
  128.  
  129.  free(word);
  130.  
  131.  return word;
  132. }
  133.  
  134. // alinhamento da memória HEAP :-X
  135.  
  136. void *xmalloc(size_t size)
  137. {
  138.  register void *ptr=malloc(size);
  139.  
  140.  if(!ptr && size)
  141.   puts("error in xmalloc()");
  142.  
  143.  return ptr;
  144. }
  145.  
  146. static size_t WriteMemoryCallback(void *ptr,size_t size,size_t nmemb,void *data)
  147. {
  148.  size_t realsize=size*nmemb;
  149.  struct MemoryStruct *mem=(struct MemoryStruct *)data;
  150.  mem->memory=realloc(mem->memory,mem->size+realsize+1);
  151.   if(mem->memory)
  152.   {
  153.    memcpy(&(mem->memory[mem->size]),ptr,realsize);
  154.    mem->size+=realsize;
  155.    mem->memory[mem->size]=0;
  156.   }
  157.  
  158.  return realsize;
  159. }
Advertisement
Add Comment
Please, Sign In to add comment