如何通过编程方式从PE文件中获取VC编译器版本?

时间:2012-12-21 03:12:45

标签: visual-c++ portable-executable

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

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

更新

  1. CFF Explorer可以为静态链接的PE文件获取正确的VC编译器版本(没有DLL依赖于msvcmXX.dll,msvcpXX.dll或msvcrXX.dll)
  2. 即使我将PE可选标头中的LinkerVersion / ImageVersion / SubsytstemVersion / OperratingSystemVersion字段清除为ZERO,CFF资源管理器仍然可以知道正确的VC编译器版本。
  3. 似乎CFF资源管理器正在使用一种更可靠的方法来检测VC编译器版本。

1 个答案:

答案 0 :(得分: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编译器签名的更多线索。