如何知道用哪种语言/技术程序(.exe)编写的?

逆向工程 拆卸 视窗 二元分析 静态分析 可执行
2021-06-26 00:31:10

如何理解 exe/dll 是用 C++/.Net/Java 还是其他任何语言编写的。我尝试使用 Dependency walker,但无法获得所需的信息。

4个回答

(重新发布对类似问题的SO 答案

在许多情况下,可以识别用于编译代码的编译器,并从中识别出原始语言。

大多数语言实现都包含某种运行时库来实现语言的各种高级操作。例如,C具有它实现文件I的CRT / O操作(fopenfread,Delphi有其编译器助手等)string类型(串联,分配等),ADA具有各种低级别的功能,以确保安全性的语言等。通过比较程序代码和候选编译器的运行时库,您可能会找到匹配项。

IDA 在FLIRT 技术中实现了这种方法通过使用签名,IDA 能够确定大多数用于 DOS 和 Windows 的主要编译器。在 Linux 上这有点困难,因为它没有编译器二进制文件的单一提供者,因此必须为每个发行版制作签名。

但是,即使不求助于运行时库代码,也可以识别所使用的编译器。许多编译器使用非常不同的习语来表示各种操作。比如我猜到毒曲病毒使用的编译器是Visual C++,后来证实了

  1. .NET 可以通过导入来识别,您可以使用依赖项warker 看到它 - 检查是否有一个导入mscorlib.dll是 .net 框架的核心库。
  2. C++ 可以通过以下方式识别
    1. 查看程序集 - 它使用此调用约定
    2. PEid可以显示有关使用的编译器和运行时的部分信息。通常,它为此使用签名列表。
    3. Detect It Easy - 此工具仍在维护中,并具有非常有趣的功能。

马可Pontello的论坛报软件通常能识别什么是用于编译文件。

Java 字节码文件可以通过它们的幻数来标识0xCAFEBABE在文件的开头。此外,标准命名约定是让这些文件的名称以.class.

但是,@hexafraction 在评论中警告说:“Java 类文件在打包到 .exe PE 中时不会看到它们的幻数或文件扩展名,除非它们被解包(假设它们只是首先被打包,而不是重新编译为机器码)”