Programming languages 有可能知道exe文件是用什么语言编写的吗?

Programming languages 有可能知道exe文件是用什么语言编写的吗?,programming-languages,exe,decompiler,Programming Languages,Exe,Decompiler,我有一个exe文件,我用Ida反编译了它。我被告知程序是用Delphi编写的,所以我尝试用DeDe反编译,但失败了,没有输出,也没有错误。我想知道,通过尝试为编程语言编写的不同反编译器,是否有可能找到创建exe时使用的语言?或者它们会因为其他原因失败吗?编译是一个有损的过程,因此通常不可能反编译可执行文件(或其他编译的程序模块,如.so或.dll)并以原始语言恢复源代码,甚至无法明确地确定原始语言是什么。甚至不一定只有一种原始源代码语言,因为在链接之前,不同的模块可能是用不同的语言编写的。通常,

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

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

在许多情况下,只要二进制文件没有被(去除符号),您就可以了解原始语言。例如,通常可以通过二进制(Linux上使用“代码> ObjDopp < /C++ >”来查看二进制文件中的符号,而不知道在Windows上的等价物是什么,C++符号是以特定方式被加密的。这不是100%的保证,但可能性很大

这就是说,一些反编译器可以完成相当合理的工作,完成非常困难的任务。从二进制文件推断可能的高级结构并不容易。在我(非常有限)的经验中,它们往往适用于相当琐碎的程序或使用原始编译器的一小部分版本编译的软件,但在任何实质性内容上都会受阻:反编译器的作者很难跟上编译器的变化,而且她这样做的动机可能很小

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

在许多情况下,可以识别用于编译代码的编译器,并且从中,原文

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

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


但是,即使不使用运行时库代码,也可以识别所使用的编译器。许多编译器使用非常独特的习惯用法来表示各种操作。例如,我认为DuCu病毒的编译器是VisualC++,后来是.< /P>当然我不希望裸源代码:但是程序开发得如此之多,它们可以以更友好的方式显示汇编代码,因此更容易逆转简单程序。谢谢,您也可以通过MingW或Cygwin在Windows上使用
objdump
。它们安装在
binutils
软件包中。