是否有可靠的方法来检测用于编译和构建给定Windows可执行文件的编译器?
单独这是一个太广泛的主题所以我缩小范围:
对于C#,很明显使用了Visual Studio附带的编译器,所以在这种情况下是否可以获得Studio的版本(年份)和类型(表达等)?
修改
从答案来看,似乎很难确定并且不总是可靠,因为必须使用启发式算法。 那么,是否有任何编译器故意在可执行文件中插入某种“水印”?我猜是否有任何,Visual Studio可能是这样的编译器(如果没有别的,我可以想象他们这样做只是为了知道是否有人使用免费快递版,或只是他们正式购买的其他版本)。但是,我在Google上找不到任何确定的答案。
答案 0 :(得分: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
答案 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