2016-10-20 5 views
0

Ich verwende die Funktion , um jedes Byte einer Datei zu lesen, und schreibe es dann mit printf.fgetc vermisst Bytes beim Lesen einer Datei

Ich habe gerade festgestellt, dass manchmal, nur einige Bytes vermisse, wenn ich mein Ergebnis mit einem Hex-Editor vergleiche.

Zum Beispiel beginnt der erste Fehler, um das 118. Byte und viele andere Fehler zufällig ...

jemand jemals erlebt?

Dies ist der Code (Windows)

char main(int argc, char* argv[]) { 
    FILE* fdIn; 
    FILE* fdOut; 
    long size = 0; 
    long i = 0; 
    char c = 0; 
    if (argc == 3) { 
     if ((fdIn = fopen(argv[1], "rt")) == NULL) { 
      printf("FAIL\n"); 
      return 0; 
     } 
     if ((fdOut = fopen(argv[2], "w+")) == NULL) { 
      printf("FAIL\n"); 
      return 0; 
     } 
     fseek(fdIn, 0L, SEEK_END); 
     size = ftell(fdIn); 
     fseek(fdIn, 0L, 0); 
     fprintf(fdOut, "unsigned char shellcode[%ld] = {", size); 
     while (i < size) { 
      c = fgetc(fdIn); 
      if (!(i % 16)) 
       fprintf(fdOut, "\n\t"); 
      fprintf(fdOut, "0x%02X", (unsigned char)c); 
      if (i != size - 1) 
       fprintf(fdOut, ", "); 
      i++; 
     } 
     fprintf(fdOut, "\n};\n"); 
     fclose(fdIn); 
     fclose(fdOut); 
     printf("SUCCESS"); 
     system("PAUSE"); 
    } 
    return 0; 
} 
+2

Öffnen Sie die Datei im Binärmodus. – chux

+3

Zeigen Sie uns Ihren Code, Ihre Testdaten, das erwartete Ergebnis und das tatsächliche Ergebnis. – NineBerry

+0

Arbeiten Sie an Windows? Sind die fehlenden Zeichen CR ('\ r',' \ 012')? Oder vielleicht^Z ('\ 032')? Haben Sie die Datei im Textmodus oder im Binärmodus geöffnet? –

Antwort

2

Öffnen Sie die Datei in Binär-Modus.

// if ((fdIn = fopen((char*)argv[1], "rt")) == NULL) { 
//         >.< 
if ((fdIn = fopen((char*)argv[1], "rb")) == NULL) { 

Im Textmodus und wahrscheinlich eine Windows-basierte Maschine angesichts der "rt", ein '\r' wird '\n' Paar sicherlich in '\n' übersetzt. IAC, für OPs Ziel eines Hex Dumps werden keine Übersetzungen benötigt.


2. Ausgabe: fgetc() eine int im Bereich von unsigned char oder EOF zurückgibt. Verwenden Sie den Typ int, um EOF von allen Dateneingaben zu unterscheiden.

// char c = 0; 
int c = 0; 
... 
c = fgetc(fdIn); 

// also add 
if (c == EOF) break; 
+0

Hinweis: Die Ausgabedatei sollte im Textmodus geöffnet bleiben, da der Code 'fprintf (fdOut," 0x% 02X "' zum Drucken von _text_ verwendet). – chux