You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:14:33