什么是反编译器如何工作?

时间:2010-05-25 04:48:21

标签: decompiling decompiler

反编译器真的是一个给出编译/解释代码片段的源码吗?因为对我来说听起来不可能。如果编译它,你将如何得到函数,变量,类等的名称。还是我误解了这个定义?它是如何工作的?制作一个人的一般原则是什么?

4 个答案:

答案 0 :(得分:10)

你对反编译器的定义是正确的:它需要一个已编译的应用程序并生成匹配的源代码。但是,在大多数情况下它确实知道变量/函数/类的名称和结构 - 它只是猜测。它分析程序的流程并试图找到一种方法来表示通过某种编程语言(通常为C)的流程。但是,因为所选择的编程语言(在本例中为C)通常处于比状态更高的级别对于底层程序(二进制可执行文件),程序的某些部分可能无法准确表示;在这种情况下,反编译器会失败,您需要使用反汇编程序。这就是为什么许多人喜欢混淆他们的代码:它使反编译器更难打开它。

构建反编译器不是一项简单的任务。基本上,您必须使用您正在反编译的应用程序(无论是可执行文件还是其他形式的编译应用程序)并将其解析为您可以在内存中使用的某种树。然后,您将分析程序的流程,并尝试找到可能暗示在代码中的某个位置使用if语句/变量/函数/等的模式。这完全只是一个猜谜游戏:你必须知道编译器在编译代码中所做的模式,然后搜索这些模式并用等效的人类可读源代码替换它们。

对于像Java或.NET这样的高级程序来说,这一点要简单得多,在这些程序中,您不必处理汇编指令,而且变量等内容主要由您来处理。在那里,您不必像直接翻译那样猜测。您可能没有确切的变量/方法名称,但至少可以很容易地推断出程序结构。

免责声明:我从未写过反编译器,因此不知道我所说的每一个细节。如果您真的对编写反编译器感兴趣,那么您应该获得一本关于该主题的书。

答案 1 :(得分:1)

反编译器基本上接受机器代码并将其恢复为格式化的语言。如果我没有弄错,我认为反编译器需要知道它编译的语言,否则它将无法工作。

反编译器的基本目的是回到源代码;例如,有一次我的Java文件被破坏了,我唯一能把它带回来的就是使用反编译器(因为类文件没有被破坏)。

答案 2 :(得分:1)

它的工作原理是推导出一个“合理的”(基于一些启发式)表示对象代码中的内容。它产生的东西与最初产生的东西之间的相似程度往往在很大程度上取决于它从二进制开始包含多少信息。如果你从基本上是一个“纯粹的”二进制文件开始,它通常只是为变量组成“合理的”名称,例如使用诸如ijk这样的循环索引,以及大多数其他人的长名称。

另一方面,支持内省的语言需要将有关变量名称,类型等的更多信息嵌入到可执行文件中。在这种情况下,反编译可以产生更接近原始的东西,例如通常保留函数,变量等的原始名称。在这种情况下,反编译器通常可以产生类似相当的东西对原文 - 可能只是格式化和评论的损失。

答案 3 :(得分:0)

这取决于您反编译的语言。如果您正在反编译C或C ++之类的东西,那么提供给您的唯一信息是函数名和参数(在DLL中)。如果您正在处理java,那么编译器通常会插入行号,变量名,字段和方法名等。如果没有变量名称,那么您将获得localInt1localInt2localException1等名称。或者无论编译器是什么。它可以告诉行之间的间距,因为行号。