《反编译技术与软件逆向分析》共分10章。第1章到第3章简要介绍了软件逆向分析技术的相关基础知识;第4章和第5章从反汇编和中间表示两个方面为反编译奠定基础;第6章到第9章针对反编译的若干关键技术展开详细介绍;第10章则为反编译测试相关的一些可用资源。全书以IA-64可执行代码为例进行讲解,但相关技术可以向其他平台推广。
《反编译技术与软件逆向分析》可作为计算机软件专业本科高年级学生、硕士研究生的相关课程教科书或教学参考书,也可供从事软件逆向分析工作的工程技术人员参考。
随着计算机科学和相关技术的不断发展,尤其是各种编程语言的不断丰富与壮大,相关人员对贴近于硬件层的低级形式编码越来越陌生。但是,事实表明计算机软件领域从来没有过,也不可能真正脱离对繁琐的低级代码进行分析的需求,而软件逆向分析技术在近年来重新成为计算机科学领域的研究热点。在众多逆向分析技术中,反编译是对目标程序分析最为彻底,但也是最为困难的技术领域。从名称上可以看出,反编译技术是编译技术的逆过程,即将低级目标可执行代码翻译为语义等价的高级语言表示形式。
本书希望能够为从事软件逆向分析的科研人员和工作者提供有效的帮助。与其他相关的逆向分析书籍不同的是,编者没有局限于对二进制代码的反汇编分析,或者局限于对不同逆向分析辅助工具的使用指导,而是希望能够在反汇编层面分析的基础上对目标低级程序进行进一步挖掘,从而获取更多的有效信息。毕竟现有的各种逆向分析工具的功能不一,不能完全满足业界复杂多变的需求。“授人以鱼,不如授之以渔”,本书希望能够帮助读者深入了解并掌握一个完整反编译工具的各个部分,从而编写真正满足自己需求的逆向分析工具。
全书分为三大部分,共10章。第一部分,包括第1章至第3章。简要介绍了软件逆向分析技术的相关基础知识,为读者的进一步阅读奠定良好的基础。包括软件逆向分析的背景知识、不同体系结构指令系统的相关背景,以及针对可执行文件格式的介绍。在指令系统一章中介绍了两种完全不同的体系结构,即CISC体系结构和EPIC体系结构,并且着重针对Intel公司的64位安腾处理器的IA-64体系结构指令系统进行分析。在可执行文件格式一章,则着重解析了在Linux操作系统中流行的ELF可执行文件格式。第二部分,包括第4章、第5章。
第1章 绪论
1.1 软件逆向分析
1.1.1 与安全相关的逆向分析
1.1.2 针对软件开发的逆向分析
1.1.3 本书的主要内容
1.2 软件逆向分析的历史
1.3 软件逆向分析的各个阶段
1.3.1 文件装载
1.3.2 指令解码
1.3.3 语义映射
1.3.4 相关图构造
1.3.5 过程分析
1.3.6 类型分析
1.3.7 结果输出
1.4 逆向分析框架
1.4.1 静态分析框架
1.4.2 动态分析框架
1.4.3 动静结合的分析框架
第2章 指令系统
2.1 指令系统概述
2.2 机器指令与汇编指令
2.2.1 机器指令
2.2.2 汇编指令
2.3 LA.6 4体系结构的特点
2.3.1 显式并行机制_
2.3.2 IA.64微处理器体系结构
2.4 指令格式
本章 小结
第3章 可执行文件
3.1 可执行文件概述
3.2 可执行文件格式
3.2.1 ELF文件的3种主要类型
3.2.2 文件格式
3.2.3 数据表示
3.2.4 文件头
3.2.5 节
3.2.6 字符串表
3.2.7 符号表
3.3 一个简单的ELF文件分析
3.3.1 文件头分析
3.3.2 section信息分析
本章 小结
第4章 反汇编技术
4.1 反汇编技术简介
4.2 反汇编算法流程
4.2.1 线性扫描算法
4.2.2 递归扫描算法
4.3 反汇编工具的自动构造方法
4.3.1 自动构造工具
4.3.2 利用自动构造方法构建IA-64反汇编器
4.4 常用反汇编工具介绍
4.4.1 IDAPro介绍
4.4.2 ILDasm介绍
本章 小结
第5章 指令的语义抽象
5.1 语义描述语言
5.1.1 SSL简介
5.1.2 SSL文法的设计
5.1.3 SSL文法的扩展
5.2 中间表示
5.2.1 低级中间表示(RTL)
5.2.2 高级中间表示(HRTL)
5.3 指令的语义抽象技术
5.3.1 语义抽象技术简介
5.3.2 指令语义的SSL描述
5.3.3 指令语义的高级模拟
5.4 基于SSL的IA.64指令语义抽象技术
5.4.1 IA.64的体系结构特征描述
5.4.2 整数指令的语义描述
5.5 基于模拟的IA.64指令语义抽象技术
5.5.1 IA.64浮点特性
5.5.2 浮点指令的语义模拟
5.5.3 浮点并行指令的语义模拟
本章 小结
第6章 基本数据类型分析
6.1 数据类型分析的相关概念
6.1.1 ITA系统中数据类型分析的依据
6.1.2 ITA系统中基本数据类型分析的重要性
6.1.3 ITA系统中基本数据类型和高级C语言数据类型
6.2 基于指令语义的基本数据类型分析
6.2.1 &和*运算符
6.2.2 普通算术指令的描述
6.2.3 内存读写指令
6.2.4 转移指令
6.3 基于过程的数据类型分析技术
6.3.1 变量重命名技术
6.3.2 变量类型推导的规则
6.3.3 格理论在变量类型推导中的应用
本章 小结
第7章 高级控制流恢复
7.1 控制流恢复概述
7.1.1 控制语句在中间代码中的组织特点
7.1.2 基本块的划分及控制流图的构建
7.1.3 控制流恢复术语
7.2 高级控制流恢复分析
7.2.1 可结构化和不可结构化循环子图
7.2.2 可结构化和不可结构化two-way条件子图
7.2.3 可结构化和不可结构化n-way条件子图
7.2.4 多重结构头节点子图
7.3 结构化算法介绍
7.3.1 对流图各节点进行正向后序遍历
7.3.2 对流图各节点进行反向后序遍历
7.3.3 直接后必经节点的确定
7.3.4 结构化含有条件判断的子图
7.3.5 使用Pr定理构建循环子图结构
7.4 可能出现的问题与解决办法
本章 小结
第8章 过程恢复技术
8.1 相关知识简介
8.1.1 调用约定
8.1.2 控制流分析及数据流分析
8.1.3 过程抽象
8.1.4 过程分析的目标
8.2 库函数恢复
8.2.1 内嵌库函数的恢复
8.2.2 动态链接库函数的恢复
8.3 用户自定义函数分析
8.3.1 函数名识别
8.3.2 用户自定义函数的参数分析
8.3.3 用户自定义函数的返回值分析
本章 小结
第9章 部分编译优化效果的消除
9.1 谓词执行效果的消除
9.1.1 谓词执行和IF转换
9.1.2 简单谓词消除策略
9.1.3 谓词分析
9.1.4 谓词消除
9.2 投机优化的消除
9.2.1 IA.64中投机的方式及实现方法
9.2.2 反投机的目的和算法设计
9.3 软件流水优化的消除
9.3.1 软件流水机制
9.3.2 IA.64软件流水循环
9.3.3 软件流水消除技术
9.3.4 ITA系统中软件流水消除技术的实现
本章 小结
第10章 程序的调试与测试
10.1 常用程序调试工具
10.2 几种常用测试集
参考文献
2.逆向分析加密算法
加密系统往往与隐私有关:一个人传递给另一个人的信息可能并不想让其他人知道。可以粗略地将加密算法分为两组:有限加密算法和基于密钥的算法。有限加密算法好比一些孩子们玩的游戏:写给一个朋友一封信,信中的每个字母都经过向上或向下的若干次移动。有限加密算法的秘密在于算法本身,一旦算法被揭露,也就毫无秘密可言。由于逆向分析可以分析出加密或解密算法,因此有限加密算法只能提供非常脆弱的安全性。由于其算法也是保密的,因此逆向分析可以被看作是对算法的破解过程。
另一方面,基于密钥的算法的秘密是密钥,即一些类似于数字的值,它们可以由某些算法来对信息进行加密和解密。在基于密钥的算法中,用户使用密钥对信息进行加密,并保证密钥的隐蔽性。这种算法通常是公开的,而仅需要保护密钥即可。由于算法是已知的,因此逆向分析变得毫无意义。为了对一条经过基于密钥算法加密的信息进行解密,可能需要以下3种途径:①获取密钥;②尝试所有可能的组合;③寻找算法中的缺陷,从而解析出密钥或最初的信息。
尽管如此,对于基于密钥加密方法的逆向分析在某些方面却意义非凡。即便加密算法广为人知,特定的实现细节也会对程序提供的所有安全级别造成意想不到的影响。无论加密算法如何精巧,很小的实现错误也有可能使该算法提供的安全级别失效。而确认一个安全产品是否真正地实现一个加密算法只有两种途径:要么分析它的源代码(假定是可行的),要么进行逆向分析。
3.数字版权管理
现代计算机系统已经将大多数类型的具有版权的材料转变为数字信息,包括音乐、影视,甚至书籍。这些信息以前只能够通过具体的媒介获取,而现在可以通过数字化信息得到。这种趋势为用户提供了巨大的好处,也为版权拥有者和内容提供商带来了一些问题。对于用户来说,这意味着资料质量的提高,并且易于获取和管理。对于提供商来说,这使得他们能够以很低的费用提供高质量的内容,但更为重要的是,这种方式使得对内容流向的控制无法完成。
数字化信息以难以想象的速度在流动,并且易于复制。这种流动性意味着一旦带有版权的资料到达用户手中,用户能够很容易地对其进行移动和复制,因此盗版也变得相当容易。通常软件公司通过在软件产品中嵌入复制保护技术防止被盗版,即通过在软件产品中嵌入代码片段来防止或限制用户对程序进行复制。