Mac下用GCC编写C语言PE文件分析器,打印MZ标识出错求助
解决Mac上GCC读取PE文件"MZ"标识输出未知数字的问题
我之前在跨平台开发PE分析工具时也碰到过一模一样的坑,来帮你拆解下可能的原因和解决办法:
最可能的原因:读取方式和变量类型不匹配
你提到输出的是“未知数字”,很大概率是你用了**整数类型(比如int)**来存储读取到的两个字节,而不是字符类型。举个例子,如果你写了类似这样的代码:
int mz_signature; fread(&mz_signature, sizeof(int), 1, fp); printf("%d", mz_signature);
PE文件开头的"M"是ASCII 0x4D,"Z"是0x5A,在小端架构的Mac上,这两个字节会被组合成整数0x5A4D(也就是十进制的23117),所以你看到的就是这个数字,而不是字符"MZ"。
正确的读取方式
应该用字符数组来读取前两个字节,然后直接打印字符:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("your_pe_file.exe", "rb"); if (!fp) { perror("Failed to open file"); // 一定要检查文件是否成功打开 return EXIT_FAILURE; } char mz[3] = {0}; // 留一个位置存字符串结束符 size_t read_bytes = fread(mz, 1, 2, fp); if (read_bytes != 2) { printf("Failed to read MZ signature\n"); fclose(fp); return EXIT_FAILURE; } printf("PE signature: %s\n", mz); // 输出MZ // 或者单独打印每个字节的十六进制值,确认是否正确 printf("Hex values: 0x%02X 0x%02X\n", (unsigned char)mz[0], (unsigned char)mz[1]); fclose(fp); return EXIT_SUCCESS; }
其他需要排查的点
- 文件路径问题:Mac上的路径分隔符是
/,如果你的代码里用了Windows风格的\,会导致打开错误的文件(甚至打开失败但没做检查),读取到的内容自然不对。一定要通过perror或者ferror确认文件是否成功打开。 - 二进制模式确认:虽然Mac OS上
"rb"和"r"的区别不像Windows那么大,但PE是二进制文件,必须确保用"rb"模式打开,避免编译器自动转换换行符(虽然这个概率很低,但值得确认)。
为什么之前Visual Studio没问题?
大概率是你在VS里的代码用了正确的字符类型读取,或者当时的代码逻辑更严谨。跨平台开发时,最容易踩的就是这类“看似相同但细节不同”的坑,慢慢习惯就好啦!
内容的提问来源于stack exchange,提问作者jp3pe
相关产品推荐
相关产品推荐

