我尝试使用此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读取文件后,我得到了相同的结果。我知道这很可能是一个愚蠢的错误,所以如何打印整个文件?
答案 0 :(得分:2)
printf()
打印文本,而不打印二进制数据。我不知道你期望什么样的输出,但那不会起作用。对于初学者,二进制数据包含零值,这些值被解释为C中字符串的结尾。
二进制数据还可以包含换行符,其他具有特殊含义的字符以及垃圾字符,这些字符在打印到屏幕时无意义。
答案 1 :(得分:2)
有很多种可能性。其中之一是%s
形成字符串的事实。字符串是一个非0字符序列,后跟一个0字符。
二进制文件在任何位置都可以有0个字符,可能在第4个位置,在第3个字符后有效地剪切字符串。