Extractor de strings de binarios

  • 0 Respuestas
  • 2330 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Jhonjhon_123

  • *
  • Underc0der
  • Mensajes: 150
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Jhonjhon_123's Software In Developed

Extractor de strings de binarios

  • en: Febrero 23, 2010, 05:59:06 pm
Muestra o guarda en un archivo los strings de un binario

Código: C
  1. // By Codr_joe
  2. // Bajo la licencia GPLv3
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. // Cambiar lo que hay entre parentesis para cambiar los caracteres que se buscaran por defecto
  8. #define default_chars "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789 \n!?\0" // El \0 hace falta para indicar el fin del string
  9.  
  10. // Cambiar para distinto numero minimo de caracteres
  11. #define default_chnum 4
  12.  
  13. int chnum;      // Numero de caracteres necesarios para considerarlo un string
  14.  
  15. void rmv_jmp(char *str);
  16. void rmv_strs(char *str,char * tgt);
  17. void add_strs(char *str,char * tgt);
  18. long f_getsize(char *fname);
  19. int exist(char *fname);
  20. void string_find(char * selected);
  21. int es_char(char ch,char* str);
  22.  
  23.  
  24. main(int argc,char* argv[]){
  25.  
  26. chnum=default_chnum;
  27.  
  28. char selected_chars[256]; // 255 Caracteres + 1 para el \0 (vamos, digo yo que ese no
  29.            // va a ser parte de un string, no?)
  30. char opt;
  31.  
  32. strcpy(selected_chars,default_chars);
  33. while (1){
  34.    printf("\n\n\t\tString Finder\n\n");
  35.    printf("Selecciona una opcion:\n");
  36.    printf("\ta) Cambiar caracteres a buscar\n");
  37.    printf("\tb) Mostrar caracteres a buscar\n");
  38.    printf("\tc) Cambiar numero caracteres a buscar (%i)\n",chnum);
  39.    printf("\td) Iniciar busqueda\n");
  40.    printf("\tx) Salir\n");
  41.    printf("->");   fflush(stdout);
  42.    opt=getchar();
  43.    getchar();         // Uno para recojer la variable y otro para sacar el [Enter] del medio
  44.    switch (opt){
  45.       case ('a'):
  46.          printf("\n\nSelecciona una opcion:\n");
  47.          printf("\ta) Añadir a la lista\n");
  48.          printf("\tb) Eliminar de la lista\n");
  49.          printf("La lista es:\n%s\n",selected_chars);
  50.          printf("->");   fflush(stdout);
  51.          opt=getchar();   getchar();
  52.          if ((opt=='a') || (opt=='b')){
  53.             char new_str[256];
  54.             printf("Introduce el/los caracteres: "); fflush(stdout);
  55.             fgets(new_str,256,stdin);
  56.             rmv_jmp(new_str);
  57.             if (opt=='a')
  58.                add_strs(new_str,selected_chars);      
  59.             else
  60.                rmv_strs(new_str,selected_chars);      
  61.          }
  62.          else {
  63.             printf("Opcion no valida\n");
  64.             printf("Pulsa [enter] para continuar");fflush(stdout);
  65.             getchar();
  66.             printf("\n");
  67.          }
  68.          break;
  69.       case ('b'):
  70.          printf("Caracteres:%s\n",selected_chars);
  71.          printf("Pulsa [enter] para continuar");fflush(stdout);
  72.          getchar();
  73.          printf("\n");
  74.          break;
  75.       case ('c'):
  76.          printf("Introduce el nuevo numero: ");
  77.          scanf("%i",&chnum);
  78.          getchar();
  79.          break;
  80.       case ('d'):
  81.          string_find(selected_chars);
  82.          break;
  83.       case ('x'):
  84.          exit(0);
  85.          break;
  86.       default:
  87.          printf("Opcion [%c] no valida.\n",opt);
  88.          printf("Pulsa [enter] para continuar");fflush(stdout);
  89.          getchar();
  90.          printf("\n");
  91.    }
  92.  }
  93. }
  94.  
  95. void string_find(char * selected_chars){
  96.    char new_char;
  97.  
  98.    char in_fname [256];
  99.    memset(in_fname,'\0',256);
  100.    FILE * fin;
  101.  
  102.    char out_fname [256];
  103.    memset(out_fname,'\0',256);
  104.    FILE * fout;
  105.  
  106.    while (1){
  107.       printf("Introduce un archivo donde buscar: ");fflush(stdout);
  108.       fgets(in_fname,256,stdin);
  109.       rmv_jmp(in_fname);
  110.       if (exist(in_fname))
  111.          break;
  112.       else
  113.          printf("El archivo no existe o no tienes permisos de lectura\n");
  114.    }
  115.  
  116.    fin=fopen(in_fname,"rb");
  117.    if (fin==NULL)
  118.       exit(1);      
  119.    while (1){
  120.       printf("Introduce un archivo donde guardar los resultados (o stdout para mostrar por pantalla): ");fflush(stdout);
  121.       fgets(out_fname,256,stdin);
  122.       rmv_jmp(out_fname);
  123.       if ((strcmp(out_fname,"stdout")==0) || (!exist(out_fname)))
  124.          break;
  125.       else{
  126.          printf("El archivo ya existe, los resultados se añadiran al final (S/n)\n");
  127.          new_char=getchar();   getchar();
  128.          if (new_char!='n')
  129.             break;
  130.       }
  131.    }
  132.    if (strcmp(out_fname,"stdout")==0)
  133.       fout=stdout;
  134.    else
  135.       fout=fopen(out_fname,"ab");
  136.    if (fout==NULL)
  137.       exit(1);
  138.    
  139.    char chars[256];
  140.    int i=0;
  141.    int es_ch;
  142.    long str_start;
  143.    long count=0;
  144.    long e=count;
  145.    long fsize=f_getsize(in_fname);
  146.    long refresh_rate=fsize/100;
  147.    
  148.    printf("\n");
  149.    while (!feof(fin)){
  150.  
  151.       fscanf(fin,"%c",&new_char);
  152.       es_ch=es_char(new_char,selected_chars);
  153.  
  154.       if (es_ch){
  155.          if (i==0)
  156.             str_start=ftell(fin);
  157.          chars[i]=new_char;
  158.          i++;
  159.       }
  160.  
  161.       if ((!es_ch && i>=chnum) || i>=255){
  162.             chars[i]='\0';
  163.             fprintf(fout,"%li--> %s\n",str_start,chars);
  164.             i=0;
  165.       }
  166.  
  167.       count++;
  168.       if (e<count-refresh_rate){
  169.          if (fout!=stdout){
  170.             printf("\r");
  171.             printf("%li / %li",count,fsize);
  172.             fflush(stdout);
  173.          }
  174.          e=count;
  175.       }
  176.  
  177.    }
  178.    if (fout!=stdout){
  179.       printf("\r");
  180.       printf("%li / %li\n",fsize,fsize);
  181.       fflush(stdout);
  182.       close(fout);
  183.    }
  184.    close(fin);
  185. }
  186.  
  187. int es_char(char ch,char* lista){
  188.    int es_char=0;
  189.    int i;
  190.    for (i=0;i<strlen(lista);i++){
  191.      
  192.       if (lista[i]==ch){
  193.          es_char=1;
  194.          break;
  195.       }
  196.    }
  197.    return es_char;
  198. }
  199.  
  200. void rmv_strs(char *str,char * tgt){
  201.    int len=strlen(tgt);
  202.    int i,j;
  203.    for (i=0;i<strlen(str);i++){
  204.       for (j=0;j<len;j++){
  205.          if (tgt[j]==str[i]){
  206.             tgt[j]=0;
  207.             break;            
  208.          }
  209.       }
  210.    }
  211.    int clean=0;
  212.    while (clean==0){
  213.       clean=1;
  214.       for (i=0;i<len;i++){
  215.          if (tgt[i]=='\0'){
  216.             for (j=i+1;j<len;j++){
  217.                if (tgt[j]!='\0'){
  218.                   clean=0;
  219.                   tgt[j-1]=tgt[j];
  220.                   tgt[j]='\0';
  221.                   break;
  222.                }
  223.             }
  224.          }
  225.       }
  226.    }
  227. }
  228.  
  229. void add_strs(char *str,char * tgt){
  230.    int len=strlen(tgt);
  231.    int i,j;
  232.    for (i=0;i<strlen(str);i++){
  233.       for (j=0;j<len;j++){
  234.          if (tgt[j]==str[i]){
  235.             break;            
  236.          }
  237.       }
  238.       if ((tgt[j]!=str[i]) && (len<255)){
  239.          tgt[len]=str[i];
  240.          len++;
  241.          tgt[len]='\0';
  242.       }
  243.    }
  244. }
  245.  
  246.  
  247.  
  248. void rmv_jmp(char *str){      //Limpia los saltos de linea que puede dejar el fgets
  249.    int i;
  250.    for (i=0;i<strlen(str);i++){
  251.       if (str[i]=='\n')
  252.          str[i]='\0';
  253.       else if (str[i]!='\0')
  254.          continue;
  255.       break;
  256.    }
  257. }
  258.  
  259. long f_getsize(char *fname){      //Devuelve el tamaño de un archivo
  260.    FILE *f;
  261.    long size;
  262.    f=fopen(fname,"rb");
  263.    if (f!=NULL){
  264.       fseek(f,0,SEEK_END);   // Vamos al final
  265.       size=ftell(f);      // Y guardamos la posicion
  266.       close(f);
  267.    }
  268.    else
  269.       size=-1;
  270.    return size;
  271. }
  272.  
  273. int exist(char *fname){         //Devuelve 0 si un archivo no existe (o no se puede leer)
  274.    FILE *f;         // o 1 si existe
  275.    int exist;
  276.    f=fopen(fname,"rb");   // Ya se que el metodo no es muy preciso
  277.    if (f!=NULL){      // pero si no se puede leer para que seguir?
  278.       exist=1;
  279.       close(f);
  280.    }
  281.    else
  282.       exist=0;
  283.    return exist;
  284. }
  285.  
  286.  
« Última modificación: Febrero 08, 2014, 06:14:05 pm por Expermicid »