3

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

单独这个话题太宽泛了,所以我缩小了范围:

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

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

编辑:

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

4

5 回答 5

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# 代码是如此不同,以至于您甚至不需要反汇编程序来识别它。

于 2012-06-27T20:30:54.000 回答
1

对于本机代码,您使用“库指纹”。见ftp://ftp.cs.wisc.edu/paradyn/papers/Jacobson11Unstrip.pdf

这里有很多签名:http ://code.google.com/p/flairdatabase/

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

于 2012-06-27T19:17:14.733 回答
1

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

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

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

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

至于母语:

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

于 2012-06-27T19:25:31.050 回答
0

您可以尝试使用 dumpbin 工具(将其称为 dumpbin /HEADERS)。它将在 OPTIONAL HEADERS 中列出链接器版本,从中您可以找出可能使用的编译器版本。请参阅垃圾箱帮助页面

于 2012-06-27T20:22:05.970 回答
0

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

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

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

于 2012-06-27T19:18:16.573 回答