找出应用程序是用什么编程语言编写的最简单的方法是什么?我想从程序 exe 文件中知道它的 vb 或 c++ 或 delphi 或 .net 等。
14 回答
尝试PEID
当然,如果他们使用打包机,则需要先进行一些拆包 :)
启动它并检查它与 Process Explorer 一起使用的运行时 DLL。
如果这不能立即显示出来,请在 Web 上搜索对这些 DLL 的引用。
大多数反汇编程序(包括我认为的 Olly)都可以轻松地向您显示 EXE 或 DLL 中包含的文本,这有时也可以提供线索。Delphi 类型通常以 T 为前缀,就像在 TMyClass 中一样。
如果它是一个没有 DLL 引用且没有文本的小型可执行文件,那么您可能是 SOL。那时你需要寻找特定编译器的习语,这主要是猜测。
检测程序是用什么语言编写的是一门艺术。这是可能的,但没有硬性规定。这需要大量的经验(这也导致了“你为什么要……”的问题,但这里有一些关于如何去做的想法。
您正在寻找的是“签名”。签名可以是编译器包含的某个字符串,对正在使用的编程工具中非常常见的 API 的引用,或者甚至是正在使用的工具中常见的编程风格,在包含的字符串中可见在应用程序中。
此外,应用程序的部署方式也有不同的风格:部署目录中的各种配置文件、dll 和程序集,甚至图像、目录或图标。
包装在自启动可执行文件中的 Java 应用程序将包含对 java 库的引用,并且可能在同一目录中包含某些库或文件,表明它是 java。
如其他答案所示,托管程序集也将显示某些迹象:您可以在反射器等中打开它。虽然 c# 和 VB 在编译后可以“互换”是正确的,但它们并不相同。如果您使用Reflector反汇编 VB 代码,您会经常看到程序集引用了 Microsoft.VisualBasic.dll 程序集。您将能够分辨出Mono应用程序之间的区别,因为它们很可能包含对 mono 程序集的引用。
许多编译器以某种方式组装和链接代码,并留下足迹。例如,在Process Explorer中使用“strings: tab”检查窗口可执行文件,您会看到很多字符串。使用这些字符串,您可以确定 exe 中的编程风格、调用的方法、错误或跟踪方法。
例如,编译器使用不同的本地化机制:Microsoft 将本地化字符串存储在 XML 文件或资源文件中。其他编译器将使用不同的策略。
另一个例子是 c++ name mangling。CodeWarrior编译器使用与 Visual Studio 不同的算法来处理调用的成员变量和函数的名称。
我想你可以写一本关于准确确定任何可执行文件的血统的书。这个主题可能会被称为“编程考古学”。
最简单的方法是询问程序的开发人员。它不需要任何知识和实用程序。
您可以尝试使用Depends来查看它具有哪些运行时依赖项,这可能会提供一些线索。
- 确定 Delphi 应用程序
- 使用 eda_preview270.exe(从这里)或其他一些间谍工具并检查窗口类名称。如果他们读起来像 TButton 或 TfrmBlubb,那么它就是一个 VCL 应用程序。如果其中有“Afx”,则可能是 MFC。
编译语言(我的意思是没有脚本语言,或 Java、.NET 等)被编译为 CPU 汇编指令,这本质上是一种单向转换。通常不可能确定程序是用哪种语言编写的。但是,使用依赖遍历器,您可能会确定程序正在加载哪个运行时库(如果有),从而确定它使用哪种语言(例如 MS Visual C++ 9使用 msvcr90.dll)。
您可以通过尝试使用 ildasm.exe 工具打开来检查是否为 .net 程序集
一般来说,你不能。
如果您可以将其加载到Reflector中,您就知道它是一个托管程序集。
这是个好问题。没有任何通用的方法可以说明,但我敢打赌,大多数编译器和库都会在生成的 EXE 文件中留下标记。如果你想花很多时间在上面,你可以收集一堆用已知语言编写的 EXE 并扫描常见的字符串。我会想象你会找到一些。
Dependancy Walker,其他人提到这将是寻找明显依赖项的好方法,例如 MSVCRT 的版本等
如果我没记错的话, PE Explorer Disassembler提供了一些关于创建给定非 .net 和 java 二进制文件的编译器的信息,对于 .net 使用Reflector或ILDAsm工具
我会尝试通过“字符串”程序运行 .exe 以获得各种提示。
我发现(至少在电脑游戏中)最简单的方法是查看嵌套在游戏主文件夹中的“redist”文件夹。对于一些在自己编程方面更有经验的人来说可能很明显,但此文件夹中 MSI 的特定目的是允许 setup.exe 文件自动安装游戏本身的先决条件。例如:在帝国全面战争中,有一个名为“vcredist_x86-sp1.exe”的微星。这表明游戏/程序是用 Microsoft 的“Visual C 2005”在 .NET Framework 中编写的(通常)。事实上,如果您打开 MSI/EXE,安装程序应该会立即指出它所使用的语言和版本。我熟悉的原因是因为我在 . NET Framework,我们会自动安装我们的业务应用程序的先决条件。希望这可以帮助!
PE Detective最适合我。