【问题标题】:How to get VC compiler version from PE file programmatically?如何以编程方式从 PE 文件中获取 VC 编译器版本?
【发布时间】:2012-12-21 03:12:44
【问题描述】:

CFF Explorer 能够从 PE 文件中检测 VC 编译器版本。 它为我的 exe 文件显示“Microsoft Visual C++ 8”,该文件静态链接到 libCMT(无 dll 依赖项)。

这是怎么做到的?它必须回复我不知道的 PE 文件中的某些结构。

更新:

  1. CFF Explorer 可以为静态链接的 PE 文件获取正确的 VC 编译器版本(不依赖于 msvcmXX.dll、msvcpXX.dll 或 msvcrXX.dll 的 DLL)
  2. 即使我将 PE 可选标头中的 LinkerVersion / ImageVersion / SubsytstemVersion / OperratingSystemVersion 字段清零,CFF explorer 仍然可以知道正确的 VC 编译器版本。

似乎 CFF 资源管理器正在使用一种非常可靠的方法来检测 VC 编译器版本。

【问题讨论】:

    标签: visual-c++ portable-executable


    【解决方案1】:

    PE Header 有一些关于链接器(或编译器)的信息。签出:

    http://wiki.osdev.org/PE

    还有:

    http://mirror.sweon.net/madchat/vxdevl/papers/winsys/pefile/pefile.htm

    PE 标头中的魔法词可能是您答案的关键。

    编辑

    似乎 CFF 资源管理器依赖于代码签名。我在这里发现了一些有趣的帖子:

    Determining Which Compiler Built a Win32 PE

    在RBerteig的回复中,内部符号可以用来判断编译器。

    http://www.codeproject.com/Articles/24417/Portable-Executable-P-E-Code-Injection-Injecting-a

    从这篇文章中,_main 地址是确定它的签名之一。

    还有这个帖子:http://ntcore.com/files/richsign.htm

    提供有关 Microsoft 编译器签名的更多线索。

    【讨论】:

    • CFF Explorer 不依赖于 MajorLinkerVersion / MiniLinkerVersion。我尝试将这些字段清零,然后用 CFF Explorer 再次打开 PE 文件,它仍然可以获得正确的编译器并显示在“文件信息”中。
    • @user325320 用编译器签名搜索,你会得到一些有趣的结果:)
    • 谢谢,我将富签名部分重置为零,它仍然可以获得正确的版本号。太棒了,我会发邮件给作者,希望他能回复我
    • 对我来说 CFF Explorer 和 PE Detective 不起作用,他们总是报告编译器是 Microsft Visual C++ 8.0,即使使用 Intel、Mingw64 或任何其他代替。还有其他更好的工具吗?问候。
    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 2016-07-09
    • 2010-10-30
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多