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

Kuz*_*gun 13 programming-languages exe decompiler

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

Igo*_*sky 10

在许多情况下,它能够识别用于编译代码的编译器,并从,原来的语言.

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

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

但是,即使不依赖于运行时库代码,也可以识别所使用的编译器.许多编译器使用非常不同的习语来表示各种操作.例如,我能够猜到用于Duqu病毒的编译器是Visual C++,后来得到了证实.


Emm*_*met 5

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

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

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

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