一个exe文件是用什么语言编写的,这个能知道吗?

14

我有一个exe文件,我用Ida反编译了它。

有人告诉我程序员使用Delphi编码,所以我尝试使用DeDe反编译,但失败了,没有输出和错误。

我想知道是否可以通过尝试针对特定编程语言编写的不同反编译器来找出创建exe时使用的语言?或者它们可能因为其他原因而失败吗?

2个回答

12

许多情况下,可以确定编译代码所使用的编译器,以及从中得出原始语言。

大多数编程语言都包含一些运行时库来实现语言的各种高级操作。例如,C语言有CRT库来实现文件I/O操作(fopenfread等),Delphi语言有编译器助手来处理字符串类型(连接、赋值和其他操作),ADA语言则有各种低级函数来确保语言安全等。通过比较程序代码和候选编译器的运行时库,您可能能够找到匹配项。

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

然而,即使不使用运行时库代码,也有可能识别出所使用的编译器。许多编译器使用非常独特的习语来表示各种操作。例如,我能够猜测Duqu病毒所使用的编译器是Visual C++,后来得到了证实


7
编译是一个有损的过程,因此通常情况下不可能反编译可执行文件(或其他已编译的程序模块,如.so.dll)并恢复原始语言的源代码,甚至不能明确确定原始语言是什么。甚至也不一定存在只有一个原始源代码语言的情况,因为在链接之前,不同的模块可能使用不同的语言编写。通常情况下,您可以反汇编二进制文件并恢复汇编语言,但这可能价值非常有限。

在许多情况下,如果二进制文件没有被剥离(符号),您可以了解一些关于原始语言的信息。例如,您通常可以通过查看二进制文件中的符号(在Linux上使用objdump,不知道Windows上的等效物是什么)来判断二进制文件是否最初是用C ++编写的:C ++符号以特定方式混淆。这不是100%的保证,但很有可能。

尽管如此,一些反编译器对于非常困难的任务做得相当不错。从二进制文件推断可能的高级结构并不容易。根据我的(非常有限的)经验,它们倾向于适用于相当琐碎的程序或使用原始编译器的一系列窄版本的软件,但对于任何重要的事情都会失败:反编译器的作者很难跟上编译器的变化,并且可能没有太多动力这样做。

即使在反编译非常成功的情况下,结果基本上是没有注释的代码,具有无意义的变量名称,非常难以理解。反编译是一回事,从结果中提取预期的语义意义是另一回事。请记住,许多变量、分支、循环和函数将被完全优化掉,许多函数将被内联,等等。因此,“源代码”,即使您可以通过这种方式获得它,也可能对您没有什么用处。


当然我不希望看到裸的源代码 :) 但是现在程序发展很多,它们可以以更加用户友好的方式展示汇编代码,因此更容易反向简单的程序。无论如何还是谢谢。 - Kuzgun
你也可以通过MingW或Cygwin在Windows上使用objdump。它们都安装在binutils软件包中。 - adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接