decompiling - 反编译是如何工作的?

标签 decompiling

我之前曾多次听说过“反编译”这个词,我开始对它的工作原理感到非常好奇。

我对它的工作原理有一个非常普遍的了解;逆向工程应用程序以查看它使用哪些功能,但除此之外我不知道太多。

我也听说过“反汇编器”这个词,反汇编器和反编译器有什么区别?

总结一下我的问题:反编译某些东西的过程到底涉及什么?通常是怎么做的?一个过程有多复杂/容易?它可以产生确切的代码吗?反编译器和反汇编器有什么区别?

最佳答案

Ilfak Guilfanov,作者 Hex-Rays Decompiler ,在一些骗局上发表了关于他的反编译器的内部工作的演讲,这里是 white paper和一个 presentation .这很好地概述了构建反编译器的所有困难以及如何使其全部工作。

除此之外,还有一些相当古老的论文,例如classical PhD thesis of Cristina Cifuentes .

至于复杂性,所有“反编译”的东西都取决于二进制文件的语言和运行时。例如,反编译 .NET 和 Java 被认为是“完成”,因为有可用的免费反编译器,成功率非常高(它们生成原始源代码)。但这是由这些运行时使用的虚拟机的非常特殊的性质造成的。

至于真正的编译语言,如 C、C++、Obj-C、Delphi、Pascal ……任务变得更加复杂。详细阅读以上论文。

what is the difference between a disassembler and a decompiler?



当您有一个二进制程序(可执行文件、DLL 库等)时,它由处理器指令组成。这些指令的语言称为汇编(或汇编)。在二进制中,这些指令是二进制编码的,以便处理器可以直接执行它们。反汇编器获取此二进制代码并将其转换为文本表示。这种翻译通常是一对一的,这意味着一条指令显示为一行文本。这个任务很复杂,但很简单,程序只需要知道所有不同的指令以及它们如何用二进制表示。

另一方面,反编译器的任务要困难得多。它采用二进制代码或反汇编器输出(基本相同,因为它是 1 对 1 的)并生成高级代码。让我给你看一个例子。假设我们有这个 C 函数:
int twotimes(int a) {
    return a * 2;
}

编译它时,编译器首先为该函数生成一个汇编文件,它可能如下所示:
_twotimes:
    SHL EAX, 1
    RET

(第一行只是一个标签而不是真正的指令,SHL 执行左移操作,即快速乘以二,RET 表示函数完成)。在结果二进制文件中,它看起来像这样:
08 6A CF 45 37 1A

(我编的,不是真正的二进制指令)。现在您知道了,反汇编器会将您从二进制形式带到汇编形式。反编译器将您从汇编形式带到 C 代码(或其他一些高级语言)。

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

相关文章:

objective-c - 类转储 z 生成空 header

windows-7 - VB3反编译器?

java - 错误: throw new UnsupportedOperationException("Method not decompiled

android - 是否有一些 Kotlin 文件的反编译器可以反编译为 kotlin *.kt 文件

android - 反编译XAPK文件

python - 如何从 PyInstaller PYZ 文件反编译文件

c - 从 x86 汇编文件反编译

android - 如何使 Phonegap/Cordova apk 安全。防止反编译

ios - 从解密的 iOS 应用程序可执行文件中查找常量

c# - 如何反编译 ASP.NET/C# Web 应用程序