2016-10-20 8 views
0

私はファイルの各バイトを読むために関数fgetcを使用して、printfでそれを書きます。fgetcはファイルを読み取っている間にバイトを逃します

時々、fgetcは、結果を16進エディタと比較すると、いくつかのバイトが欠落していることに気付きました。例えば

、最初の間違いは、118番目のバイトの周りに開始され、他の多くのミスがランダムに...

誰かが今までにこれを経験しましたか?

これはコード(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

バイナリモードでファイルを開きます。 – chux

+3

あなたのコード、テストデータ、期待される結果、実際の結果を教えてください。 – NineBerry

+0

WIndowsで作業していますか?行方不明の文字はCR( '\ r'、' \ 012')ですか?あるいは^ Z( '\ 032')?テキストモードまたはバイナリモードでファイルを開いたのですか? –

答えて

2

はバイナリモードでファイルを開きます。です

テキストモードで
// if ((fdIn = fopen((char*)argv[1], "rt")) == NULL) { 
//         >.< 
if ((fdIn = fopen((char*)argv[1], "rb")) == NULL) { 

、および"rt"与えられた可能性が高いのWindowsベースのマシンは、'\r''\n'ペアは確かに'\n'に翻訳されています。 IACでは、OPの16進ダンプの目標には翻訳は必要ありません。


2号:unsigned char又はEOFの範囲内intを返しfgetc()。タイプintを使用して、すべてのデータ入力からEOFを区別してください。

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

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

注:出力ファイルは、コードが '_printを出力するために' fprintf(fdOut、 "0x%02X" 'を使用しているので、テキストモードで開いたままにしておきます。 – chux

関連する問題