2016-10-20 11 views
0

파일의 각 바이트를 읽으려면 fgetc 함수를 사용하고 printf으로 씁니다.fgetc가 파일을 읽는 동안 바이트를 놓치지 않습니다.

가끔은 fgetc이 16 진수 편집기와 결과를 비교할 때 몇 바이트를 놓친 것으로 나타났습니다. 예를 들어

는 첫 번째 실수는 118 바이트 주위에 시작하고, 무작위로 다른 많은 실수는 ...

누군가가 이제까지 이것을 경험?

코드 (윈도우) 바이너리 모드에서

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" 주어진 윈도우 기반의 컴퓨터는 '\r', '\n' 쌍은 확실히 '\n'로 변환됩니다. IAC에서는 OP의 16 진 덤프 목표에 대한 번역이 필요하지 않습니다.


2 문제 : unsigned char 또는 EOF의 범위에 int를 반환 fgetc(). 모든 데이터 입력에서 EOF을 구별하려면 int 유형을 사용하십시오.

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

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

참고 : 출력 파일은 텍스트 모드에서 열어야합니다. 코드는'fprintf (fdOut, "0x % 02X"'를 사용하여 _text_를 인쇄합니다. – chux