有可能知道exe文件用什么语言编写?

时间:2013-09-03 15:02:37

标签: programming-languages exe decompiler

我有一个exe文件,我用Ida反编译它。有人告诉我用Delphi编写的程序,所以我尝试用DeDe反编译但是失败了,没有输出也没有错误。我想知道是否有可能通过尝试专门为编程语言编写的不同反编译器来找到用于创建exe的语言?或者他们可以因其他原因而失败吗?

2 个答案:

答案 0 :(得分:10)

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

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

IDA在FLIRT technology中实施此方法。通过使用签名,IDA能够确定DOS和Windows的大多数主要编译器。在Linux上有点困难,因为没有单独的编译器二进制提供程序,因此必须为每个发行版进行签名。

但是,即使不使用运行时库代码,也可以识别所使用的编译器。许多编译器使用非常不同的习语来表示各种操作。例如,编译器用于Duqu病毒的I was able to guess是Visual C ++,后来是confirmed

答案 1 :(得分:5)

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

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

也就是说,一些反编译器在一项非常困难的任务中做了相当合理的工作。从二进制文件中推断出可能的高级构造并不容易。在我(非常有限)的经历中,他们倾向于为相当简单的程序或使用原始编译器的窄版本编译的软件工作,但是对任何实质性的东西都嗤之以鼻:反编译器的作者很难跟上编译器的变化,她可能没有什么动力去做。

即使在反编译非常成功的情况下,结果基本上是完全未注释的代码,其中包含无意义的变量名,这些代码极难理解。反编译是一回事,从结果中提取预期的语义是另一回事。请记住,许多变量,分支,循环和函数将被完全优化,许多函数将被内联,等等。所以“源代码”,即使你能以这种方式获得它,也许不是很多对你有用。