【问题标题】:Identifying compiler version from Windows executable从 Windows 可执行文件中识别编译器版本
【发布时间】:2012-06-27 19:09:11
【问题描述】:

是否有可靠的方法来检测用于编译和构建给定 Windows 可执行文件的编译器?

仅此一个主题过于宽泛,因此我将其缩小:

  • 我只对 C 系列的语言(C、C++、C#)感兴趣
  • 假设可执行文件未被篡改以隐藏此信息。
  • Visual Studio 和最著名的 gnu 编译器就足够了,因此无需处理非常旧的或不广泛使用的编译器。

在 C# 的情况下,很明显它使用了 Visual Studio 附带的编译器,那么在这种情况下,是否可以获得 Studio 的版本(年份)和类型(快递等)?

编辑:

从答案看来,这似乎很难确定,而且并不总是可靠的,因为必须使用启发式方法。 那么,是否有任何编译器故意在可执行文件中插入某种“水印”?我在猜测是否有,Visual Studio 可能是这样的编译器(如果没有别的,我可以想象他们这样做只是为了知道是否有人使用免费的快递版,或者只是他们正式购买的另一个版本)。但是,我在 Google 上找不到任何明确的答案。

【问题讨论】:

  • C# 不属于 C 家族!
  • 在 C# 的情况下,没有办法判断是否使用了 VS。 VS 不是编译器。 VS使用msbuild,使用csc,两者都可以不用VS。
  • @vsz:几乎没有“语义”,除了一些语法相似性(这与您的问题完全无关)之外,它们甚至都不是很接近。没有“更好的词”,就像要一个词来形容汽车和果冻一样。

标签: c# c++ c windows compiler-construction


【解决方案1】:
【解决方案2】:

这实际上是两个问题,因为 C/C++ 和 C# 完全不同。我将尝试回答 C# 问题。

始终为特定的 .NET Framework 版本构建 C# 程序集。通过检查程序集的版本,您可以确定使用了哪个版本的编译器。每个版本的框架都有自己的编译器。

无法从编译后的程序集中找到有关 Visual Studio 的详细信息,因为编译器不是 VS 的一部分。您可以假设 .NET 4 程序集是使用 VS 2010 构建的,但仅此而已。据我们所知,它可能是用记事本编写的。

也有可能使用了除 csc 之外的编译器,但这种情况并不经常发生,除了 Mono,所以我会忽略它。

至于母语:

没有可靠的方法可以知道使用了哪个编译器。甚至没有办法确定使用了哪种语言。您所需要处理的只是机器代码和二进制数据,因此您必须根据已知的编译器模式做出有根据的猜测。

【讨论】:

  • 最近的 C# 编译器针对较旧的框架版本或使用 Mono 编译器编译的代码怎么样?
  • AFAIK,C# 编译器不向后兼容。至于 .NET 和 Mono 之间的区别,您需要使用相同的有根据的猜测。
【解决方案3】:

IDA 反汇编器能够识别静态编译的编译器标准库:

http://www.hex-rays.com/products/ida/index.shtml

http://www.hex-rays.com/products/ida/tech/flirt/in_depth.shtml

如果只讨论MSVC,它会在ECX寄存器中传递this指针,所以如果你看到这个,代码可能是C++(不是C)并使用对象。更多内容:http://en.wikipedia.org/wiki/X86_calling_conventions

C# 代码如此不同,您甚至不需要反汇编程序来识别它。

【讨论】:

    【解决方案4】:

    没有官方或标准的方法来识别用于制作二进制或可执行对象的工具。 Windows 可执行格式不需要有关工具的信息;也不是使用的语言。

    也许可以通过识别代码模式来区分工具,但这非常困难。人们使用不同的工具重写软件是如此困难和耗时。

    顺便说一句,除了 Visual Studio 和 GNU,还有其他工具。

    【讨论】:

    • 是的,我知道还有其他工具,这就是我缩小这两个工具的原因。
    【解决方案5】:

    您可以尝试使用 dumpbin 工具(将其称为 dumpbin /HEADERS)。它将在 OPTIONAL HEADERS 中列出链接器版本,从中您可以找出可能使用的编译器版本。 见dumpbin help page

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2016-01-19
      • 2011-02-18
      • 2012-08-20
      相关资源
      最近更新 更多