decompiling - 什么是反编译器它是如何工作的?

标签 decompiling decompiler

<分区>

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

最佳答案

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

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

这对于 Java 或 .NET 等高级程序来说要简单得多,在这些程序中您不必处理汇编指令,变量之类的事情大部分都会为您处理。在那里,您无需猜测,只需直接翻译即可。您可能没有确切的变量/方法名称,但您至少可以很容易地推断出程序结构。

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

关于decompiling - 什么是反编译器它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632927/

相关文章:

Delphi反编译

java - 这是什么引用?

java - 尝试在 Eclipse Luna 中运行反编译器

java - 在反编译的混淆匿名内部类中找不到 "this.b.a.q()"方法

c++ - 有什么办法可以反编译Linux .so?

java - Scala 生成的字节码到 Java 代码的转换

java - 无法在eclipse中打开jar文件

c# - 从 dll 和 pdb 文件 Visual Studio 反编译自己的类

c# - 对象类型末尾的 & 字符是什么?

java - 什么是列出已编译的 Java 类所需的所有导入的可移植方法