fopen und ELF binaries



  • hi,

    mal eine kurze frage und zwar verstehe ich nicht, warum das unten angegebene code snippet keine elf files einlesen kann. wenn ich z.b ein textfile einlesen will, steht "len" auf korrekte 90, wenn ich aber nun ein binary einlese steht len immer auf max "7". liegt das an fopen, fread oder...?

    ...
      FILE *bin;
      char *bin_mem;
      size_t len;
    
      bin = fopen(path, "rb");
      bin_mem = malloc(90);
      fread(bin_mem, 1, 90, bin);
      len = strlen(bin_mem);
      printf("%d", len);
    ...
    


  • Weil man: strlen(3) alle chars zählt bis ein char gleich 0 ist.



  • klar, total vergessen. aber wie kann ich das umgehen, denn fuer z.b fuer textfiles brauch ich die funktion ja. kannst mir ein denkanstosz geben?



  • hat sich grad erledigt, habs so gemacht:

    fseek(bin, 0, SEEK_END);
      b_size = ftell(bin);
      rewind(bin);
    
      len = b_size
    

    danke kingruedi 🙂



  • Das ist auch wieder problematisch, da es laut ISO C bei Binären Dateien nicht funktionieren muss 🙂



  • hmmmm...
    🙂
    haetteste eine andere idee?



  • Du könntest man: stat(2) unter POSIX benutzen. Obwohl unter POSIX sollte das mit dem man: ftell(3) auch gehen.



  • hmmm, jetzt hab ich dann bei ftell gelassen und frag mich ich nun daher zu solchem ergebnis komme:

    00000000  7f 45 4c 46 01 01 01 00   00 00 00 00 00 00 00 00   |.ELF............|
    00000010  02 00 03 00 01 00 00 00   50 0e 00 1c 34 00 00 00   |........P...4...|
    00000020  ffffff84 ffffffb0 00 00 00 00 00 00   34 00 20 00 09 00 28 00   |.°......4. ...(.|
    00000030  16 00 15 00 06 00 00 00   34 00 00 00 34 00 00 1c   |........4...4...|
    00000040  34 00 00 1c 20 01 00 00   20 01 00 00 05 00 00 00   |4... ... .......|
    00000050  04 00 00 00 03 00 00 00   ffffff94 01 00 00 ffffff94 01 00 1c   |................|
    00000060  ffffff94 01 00 1c 13 00 00 00   13 00 00 00 04 00 00 00   |................|
    00000070  01 00 00 00 01 00 00 00   00 00 00 00 00 00 00 1c   |................|
    00000080  00 00 00 1c ffffffa6 73 00 00   ffffffa6 73 00 00 05 00 00 00   |....¦s..¦s......|
    
    ...
      FILE *bin;
      char *bin_mem;
      int cell = 16;
      u_long oset = 0, cind = 0;
      u_long hpos = 0, apos = 0;
      size_t len;
    
      bin = fopen(path, "rb");
    
      if(bin == NULL) {
        printf("error: file not found!\n");
      }
    
      fseek(bin, 0, SEEK_END);
      b_size = ftell(bin);
      rewind(bin);
    
      bin_mem = malloc(b_size);
    
      if(bin_mem == NULL) {
        printf("error: allocation too big\n");
      }
    
      fread(bin_mem, 1, b_size, bin);
      len = b_size;
    
      printf("%08x  ", oset);
      while(hpos <= len) {
        for(cind = 0; cind < cell && hpos <= len; cind++, hpos++) {
          printf("%02x ", *(bin_mem+hpos));
            if(cind == 7) {
              printf("  ");
            }
        }
        printf("  |");
        for(cind = 0; cind < cell && apos <= len; cind++, apos++) {
          if(isprint(*(bin_mem+apos))) {
            printf("%c", *(bin_mem+apos));
          }
          else {
            printf(".");
          }
        }
        printf("|\n");
        printf("%08x  ", oset+=cell);
      }
    
      free(bin_mem);
      fclose(bin);
      printf("\n");
    ...
    

    so ein output erhalte ich aber nur bei elf dateien. woran liegt das?



  • hab den fehler gefunden:

    musste in dieser zeile noch den wert zu einem unsigned char casten
    printf("%02x ",(unsigned char)*(bin_mem+hpos));


Anmelden zum Antworten