我试图用这个 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读取文件后,结果一样。我知道这很可能是一个愚蠢的错误,那么如何打印出整个文件呢?
最佳答案
有很多可能性。其中之一是 %s
格式是针对字符串的。字符串是非 0 字符的序列,后跟一个 0 字符。
二进制文件可以在任何位置有一个 0 字符,可能在位置 4,有效地在第 3 个字符之后切割字符串。
关于无法正确读取 C 中的 .exe 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33763629/