无法正确读取C中的.exe文件

时间:2015-11-17 17:45:10

标签: c

我尝试使用此C应用程序打印出PE文件的原始数据:

int main(int argc, char *argv[])
    {
    if (argc != 2) 
    {printf("Syntax: <file>\n"); 
    return 0;
    }
    FILE *f = fopen(argv[1], "rb");
    if (f == NULL)
    {
        printf("Open file failed.\n");
        return 0; 
    }
    fseek(f, 0, SEEK_END);
    long fsize = ftell(f);
    fseek(f, 0, SEEK_SET);
    unsigned char *string = (unsigned char*)malloc(fsize + 1);
    fread(string, fsize, 1, f);
    fclose(f);
    string[fsize] = 0;
    printf("File content:\n ");  
    printf("%s", string); 
    return 0;}

我用MinGw gcc编译了它:

foo.c -o foo.exe -m32

如果我将文本文件传递给foo.exe,它会打印出该文件的内容,但如果我尝试打印出.exe的原始数据,它只会给我前3个字节:MZE。 我认为它与fseek()有关,它可能找不到合适的EOF,但在我使用winapi ReadFile读取文件后,我得到了相同的结果。我知道这很可能是一个愚蠢的错误,所以如何打印整个文件?

2 个答案:

答案 0 :(得分:2)

printf()打印文本,而不打印二进制数据。我不知道你期望什么样的输出,但那不会起作用。对于初学者,二进制数据包含零值,这些值被解释为C中字符串的结尾。

二进制数据还可以包含换行符,其他具有特殊含义的字符以及垃圾字符,这些字符在打印到屏幕时无意义。

答案 1 :(得分:2)

有很多种可能性。其中之一是%s形成字符串的事实。字符串是一个非0字符序列,后跟一个0字符。

二进制文件在任何位置都可以有0个字符,可能在第4个位置,在第3个字符后有效地剪切字符串。