返回介绍

1.2 何为反汇编

发布于 2024-10-11 21:05:39 字数 948 浏览 0 评论 0 收藏 0

在传统的软件开发模型中,程序员使用编译器、汇编器和链接器中的一个或几个创建可执行程序。为了回溯编程过程(或对程序进行逆向工程),我们使用各种工具来撤销汇编和编译过程。毫不奇怪,这些工具就叫做 反汇编器反编译器 ,名副其实。反汇编器撤销汇编过程,因此,我们可以得到汇编语言形式的输出结果(以机器语言作为输入)。反编译器则以汇编语言甚至是机器语言为输入,其输出结果为高级语言。

在竞争激烈的软件市场中,“恢复源代码”的前景总是充满吸引力。因此,在计算机科学中,开发适用的反编译器仍然是一个活跃的研究领域。下面列举若干原因,说明为何反汇编困难重重。

  • 编译过程会造成损失 。机器语言中没有变量或函数名,变量类型信息只有通过数据的用途(而不是显式的类型声明)来确定。看到一个 32 位的数据被传送,你需要进行一番分析,才能确定这个 32 位数据表示的到底是一个整数、一个 32 位浮点值还是一个 32 位指针。

  • 编译属于多对多操作 。这意味着源程序可以通过许多不同的方式转换成汇编语言,而机器语言也可以通过许多不同的方式转换成源程序。因此,编译一个文件,并立即反编译,可能会得到与输入时截然不同的源文件。

  • 反编译器非常依赖于语言和库 。用专门用来生成 C 代码的反编译器处理由 Delphi 编译器生成的二进制文件,可能会得到非常奇怪的结果。同样,用对 Windows 编程 API 一无所知的反编译器处理编译后的 Windows 二进制文件,也不会得到任何有用的结果。

  • 要想准确地反编译一个二进制文件,需要近乎完美的反汇编能力 。几乎可以肯定,反汇编阶段的任何错误或遗漏都会影响反编译代码。

第 23 章将介绍当今市场上最复杂的反编译器 Hex-Rays 。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文