从Windows可执行文件中识别编译器版本

时间:2012-06-27 19:09:12

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

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

单独这是一个太广泛的主题所以我缩小范围:

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

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

修改

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

5 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

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

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

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

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

至于母语:

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

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:0)

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

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

除了Visual Studio和GNU之外,还有其他工具。

答案 4 :(得分:0)

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