什么是找出应用程序编写的编程语言的最简单方法?我想从程序exe文件中知道它的vb或c ++或delphi或.net等.
试试PEiD
当然,如果他们使用包装工,首先需要进行一些拆包:)
启动它并检查它与Process Explorer一起使用的运行时DLL.
如果这不能立即显现,请在Web上搜索对这些DLL的引用.
大多数反汇编程序(包括我认为的Olly)可以很容易地向您显示EXE或DLL中包含的文本,这有时也可以提供线索.Delphi类型通常以T为前缀,如TMyClass.
如果它是一个没有DLL引用且没有文本的小型可执行文件,那么您可能是SOL.那时你需要寻找特定编译器的习语,而且主要是猜测.
有一种艺术可以检测程序编写的语言.有可能但没有严格的规则.它需要很多经验(并且它还会导致问题"你为什么要...",但这里有一些关于如何去做的想法.
您正在寻找的是"签名".签名可以是编译器包含的某个字符串,对正在使用的编程工具中非常常见的API的引用,或者甚至是正在使用的工具所共有的编程风格,在包含的字符串中可见在申请中.
此外,还有部署应用程序的样式:部署目录中的各种配置文件,dll和程序集,甚至图像,目录或图标.
包含在自启动可执行文件中的Java应用程序将包含对java库的引用,并且可能在同一目录中包含某些库或文件,这些库或文件指示它是java.
如其他答案中所示,托管程序集也会显示某些符号:您可以在Reflector等中打开它.虽然编译后c#和VB是"可互换的"是正确的,但它们是完全相同的.如果您使用Reflector反汇编VB代码,您将经常看到程序集引用Microsoft.VisualBasic.dll程序集.您将能够区分Mono应用程序,因为它们很可能包含对单声道程序集的引用.
许多编译器以某种方式汇编和链接代码,并留下足迹.例如,使用Process Explorer中的 "strings:tab"检查窗口可执行文件,您将看到很多字符串.使用这些字符串,您可以确定编程样式,调用方法,错误或跟踪方法.
一个例子是编译器使用不同的本地化机制:Microsoft将本地化的字符串存储在XML文件或资源文件中.其他编译器将使用不同的策略.
另一个例子是c ++ 名称修改.该CodeWarrior的编译器使用不同的算法来裂伤比Visual Studio中调用的成员变量和函数的名称.
我想你可以写一本关于准确确定任何可执行文件的血统的书.这个主题可能被称为"编程考古学".