- 献词
- 致谢
- 前言
- 第一部分 IDA 简介
- 第 1 章 反汇编简介
- 第 2 章 逆向与反汇编工具
- 第 3 章 IDA Pro 背景知识
- 第二部分 IDA 基本用法
- 第 4 章 IDA 入门
- 第 5 章 IDA 数据显示窗口
- 第 6 章 反汇编导航
- 第 7 章 反汇编操作
- 第 8 章 数据类型与数据结构
- 第 9 章 交叉引用与绘图功能
- 第 10 章 IDA 的多种面孔
- 第三部分 IDA 高级应用
- 第 11 章 定制 IDA
- 第 12 章 使用 FLIRT 签名来识别库
- 第 13 章 扩展 IDA 的知识
- 第 14 章 修补二进制文件及其他 IDA 限制
- 第四部分 扩展 IDA 的功能
- 第 15 章 编写 IDA 脚本
- 第 16 章 IDA 软件开发工具包
- 第 17 章 IDA 插件体系结构
- 第 18 章 二进制文件与 IDA 加载器模块
- 第 19 章 IDA 处理器模块
- 第五部分 实际应用
- 第 20 章 编译器变体
- 第 21 章 模糊代码分析
- 第 22 章 漏洞分析
- 第 23 章 实用 IDA 插件
- 第六部分 IDA 调试器
- 第 24 章 IDA 调试器
- 第 25 章 反汇编器/ 调试器集成
- 第 26 章 其他调试功能
- 附录 A 使用 IDA 免费版本 5.0
- 附录 B IDC/SDK 交叉引用
1.2 何为反汇编
在传统的软件开发模型中,程序员使用编译器、汇编器和链接器中的一个或几个创建可执行程序。为了回溯编程过程(或对程序进行逆向工程),我们使用各种工具来撤销汇编和编译过程。毫不奇怪,这些工具就叫做 反汇编器 和 反编译器 ,名副其实。反汇编器撤销汇编过程,因此,我们可以得到汇编语言形式的输出结果(以机器语言作为输入)。反编译器则以汇编语言甚至是机器语言为输入,其输出结果为高级语言。
在竞争激烈的软件市场中,“恢复源代码”的前景总是充满吸引力。因此,在计算机科学中,开发适用的反编译器仍然是一个活跃的研究领域。下面列举若干原因,说明为何反汇编困难重重。
编译过程会造成损失 。机器语言中没有变量或函数名,变量类型信息只有通过数据的用途(而不是显式的类型声明)来确定。看到一个 32 位的数据被传送,你需要进行一番分析,才能确定这个 32 位数据表示的到底是一个整数、一个 32 位浮点值还是一个 32 位指针。
编译属于多对多操作 。这意味着源程序可以通过许多不同的方式转换成汇编语言,而机器语言也可以通过许多不同的方式转换成源程序。因此,编译一个文件,并立即反编译,可能会得到与输入时截然不同的源文件。
反编译器非常依赖于语言和库 。用专门用来生成 C 代码的反编译器处理由 Delphi 编译器生成的二进制文件,可能会得到非常奇怪的结果。同样,用对 Windows 编程 API 一无所知的反编译器处理编译后的 Windows 二进制文件,也不会得到任何有用的结果。
要想准确地反编译一个二进制文件,需要近乎完美的反汇编能力 。几乎可以肯定,反汇编阶段的任何错误或遗漏都会影响反编译代码。
第 23 章将介绍当今市场上最复杂的反编译器 Hex-Rays 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论