内容简介
本书首先从正向角度介绍编译系统的一般原理和基本实现技术,主要内容有词法分析、语法分析、语义分析与处理、符号表、运行时存储组织、优化、目标代码生成和多样化编译等;然后从反向角度介绍反编译的相关原理和技术,包括反编译及其关键要素、反编译器的整体框架、反编译中的指令解码和语义描述与映射、反编译中的恢复技术、编译优化的反向处理、反编译与信息安全等。 本书可作为计算机及信息安全相关专业高年级本科生的教科书或教学参考书,也可供计算机相关专业研究生和从事编程或者软件逆向分析工作的工程技术人员参考。
目录
前言
教学建议
第1章 引论 1
1.1 编译器与解释器 1
1.2 编译过程 2
1.3 编译器结构 2
1.4 编译器的分类及生成 3
1.5 高级语言及其分类 3
1.6 编译的前端和后端 4
1.7 C语言程序的编译流程 4
1.8 UNIX/Linux环境中的make和makefile 7
1.9 本章小结 12
习题 12
第2章 词法分析的理论与实践 13
2.1 词法分析器的需求分析 13
2.1.1 词法分析器的功能 13
2.1.2 分离词法分析的原因 14
2.2 词法分析器的设计 15
2.2.1 输入及其处理 15
2.2.2 单词符号的描述:正规文法和正规式 15
2.2.3 单词符号的识别:超前搜索 21
2.2.4 状态转换图及其实现 22
2.3 有穷自动机 28
2.3.1 确定的有穷自动机 28
2.3.2 非确定的有穷自动机 29
2.3.3 NFA到DFA的转化 29
2.3.4 DFA的化简 31
2.4 正规式和有穷自动机的等价性 33
2.5 词法分析器的生成器 35
2.6 本章小结 37
习题 37
第3章 语法分析 39
3.1 上下文无关文法 39
3.1.1 上下文无关文法的定义 39
3.1.2 语法树和推导 40
3.1.3 二义性 43
3.2 语法分析器的功能 45
3.3 自上而下的语法分析 45
3.3.1 LL(1)分析方法 45
3.3.2 预测分析程序 53
3.4 自下而上的语法分析 56
3.4.1 移进与归约 56
3.4.2 LR分析 57
3.4.3 LR(0)分析 60
3.4.4 SLR(1)分析 66
3.4.5 LR(1)分析 69
3.4.6 LALR(1)分析 72
3.4.7 分析方法比较 76
3.5 语法分析器的生成器 76
3.6 本章小结 78
习题 78
第4章 语义分析与处理 81
4.1 语法制导定义与语法制导翻译 82
4.2 中间语言 91
4.3 语句的翻译 95
4.3.1 说明语句的翻译 95
4.3.2 赋值语句的翻译 100
4.3.3 控制语句的翻译 106
4.3.4 过程调用语句的翻译 120
4.4 本章小结 121
习题 121
第5章 符号表 124
5.1 符号表的作用 124
5.2 符号表的内容 125
5.3 符号表的组织 127
5.4 符号表的实现 129
5.5 名字的作用域 132
5.6 本章小结 135
习题 135
第6章 运行时存储组织 137
6.1 静态存储分配 138
6.2 动态存储分配 138
6.3 栈式动态存储分配 140
6.3.1 简单的栈式存储分配的实现 140
6.3.2 嵌套过程语言的栈式实现 141
6.4 堆式动态存储分配 145
6.5 存储分配与安全性 146
6.5.1 缓冲区溢出原理 146
6.5.2 缓冲区溢出的防范 147
6.6 本章小结 148
习题 148
第7章 优化 150
7.1 优化技术简介 150
7.2 局部优化 151
7.3 循环优化 161
7.4 全局优化 172
7.4.1 到达–定值数据流分析 173
7.4.2 活跃变量数据流分析和
定值–引用数据流分析 178
7.4.3 可用表达式数据流分析 182
7.4.4 复写传播数据流分析 186
7.5 本章小结 192
习题 193
第8章 目标代码生成 196
8.1 代码生成器设计中的问题 196
8.1.1 代码生成器的输入 196
8.1.2 目标程序 196
8.1.3 指令选择 197
8.1.4 变量存储空间分配 197
8.2 寄存器分配 197
8.2.1 寄存器分配描述 198
8.2.2 线性扫描的寄存器分配 199
8.2.3 图着色的寄存器分配 201
8.3 窥孔优化 202
8.3.1 规则提取 202
8.3.2 扫描匹配和等价语义转换 203
8.3.3 举例说明 205
8.4 一个代码生成器实例 205
8.4.1 待用信息和活跃信息 206
8.4.2 寄存器描述和地址描述 207
8.4.3 代码生成算法 208
8.5 本章小结 209
习题 209
第9章 多样化编译 210
9.1 软件多样化需求 210
9.2 多变体执行及其环境 211
9.3 海量软件多样性 212
9.4 多样化编译技术 213
9.5 多样化编译的应用 216
9.6 本章小结 217
习题 217
第10章 反编译及其关键要素 218
10.1 什么是反编译 218
10.1.1 反编译概念 218
10.1.2 编译与反编译 219
10.1.3 反编译器 219
10.2 反编译的基本过程 219
10.2.1 按照反编译技术实施的顺序划分 220
10.2.2 按照反编译实践中的具体操作划分 224
10.2.3 按照反编译器的功能块划分 227
10.3 反编译的前世今生 228
10.3.1 建立——20世纪60年代 228
10.3.2 发展——20世纪70年代 229
10.3.3 瓶颈期——20世纪80年代 231
10.3.4 反编译的春天来了——20世纪90年代 232
10.3.5 持续的研究——进入21世纪 235
10.3.6 身边的反编译——我国对反编译的研究 236
10.4 反编译的局限、先决条件和评价指标 236
10.4.1 反编译技术面临的宏观问题 236
10.4.2 反编译技术面临的技术性问题 237
10.4.3 反编译的先决条件 238
10.4.4 反编译器的评价指标 238
10.5 反编译的应用领域和研究重点 239
10.5.1 应用领域 239
10.5.2 研究重点 239
10.6 本章小结 240
习题 240
第11章 反编译器的整体框架 241
11.1 “I型”反编译器的框架 241
11.1.1 上下文环境的衔接 241
11.1.2 dcc反编译器的框架 242
11.2 经典多源反编译框架简介 243
11.2.1 UQBT 243
11.2.2 Hex-Rays 247
11.2.3 BAP 247
11.3 具备静态反编译能力的二进制翻译器ITA 248
11.3.1 ITA总体框架 248
11.3.2 二进制文件解码 249
11.3.3 语义映射 251
11.3.4 过程抽象分析 251
11.3.5 优化代码消除 251
11.3.6 C代码产生器 252
11.3.7 从ITA看静态反编译存在的普遍问题 252
11.3.8 对ITA静态反编译框架的扩展ITA-E 253
11.4 具备动静结合反编译能力的二进制翻译器UTP-MBC 254
11.4.1 UTP-MBC架构设计需要解决的主要问题 255
11.4.2 UTP-MBC翻译器的相关研究 256
11.4.3 一体化翻译架构设计 257
11.5 本章小结 260
习题 261
第12章 反编译中的指令解码和语义描述与映射 262
12.1 指令描述和指令解码 262
12.1.1 相关研究 262
12.1.2 编解码描述语言SLED 263
12.1.3 基于SLED的x64指令描述和解码 266
12.1.4 SLED在多源一体解码体系中的应用 270
12.2 指令的语义映射 275
12.2.1 相关研究 276
12.2.2 语义描述语言SSL 276
12.2.3 中间表示 282
12.2.4 一个示例——指令原子语义描述语言ASDL 284
12.3 本章小结 288
习题 288
第13章 反编译中的恢复技术 290
13.1 数据流和数据恢复 290
13.1.1 数据流分析 290
13.1.2 数据恢复方法——以IA-64架构上的反编译为例 297
13.1.3 小结 310
13.2 高级控制流恢复 310
13.2.1 控制流恢复概述 311
13.2.2 高级控制流恢复分析 315
13.2.3 结构化算法介绍 318
13.2.4 可能的问题与解决办法 325
13.2.5 小结 325
13.3 过程恢复 325
13.3.1 相关知识简介 326
13.3.2 库函数的识别技术 328
13.3.3 用户自定义函数的过程恢复 335
13.4 本章小结 349
习题 349
第14章 编译优化的反向处理 350
14.1 常用的编译优化方法 350
14.1.1 编译优化的原则 350
14.1.2 优化手段的分类 350
14.2 部分编译优化的消除——谓词执行 351
14.2.1 谓词执行 351
14.2.2 IA-64平台的谓词指令 351
14.2.3 谓词消除 353
14.3 本章小结 358
习题 358
第15章 反编译与信息安全 359
15.1 基于反编译的恶意行为识别 359
15.1.1 恶意代码检测背景 359
15.1.2 文件格式异常信息 363
15.1.3 指令序列层行为信息提取 366
15.1.4 函数调用信息提取 369
15.2 反编译在恶意代码检测中的应用 377
15.2.1 系统架构的提出 377
15.2.2 推理算法研究的基本内容 378
15.2.3 恶意特征生成 380
15.2.4 推理规则库的建立 381
15.2.5 多重多维模糊推理算法的研究与实现 385
15.3 本章小结 391
习题 391
参考文献 392
前言/序言
前言 “编译原理”是高等院校计算机科学与技术和软件工程专业的必修专业课之一,是一门理论与实践相结合的课程,对大学生科学思维的养成和解决实际问题能力的提高具有重要作用。“编译技术”是“编译原理”课程中介绍的关键技术,已经被广大计算机软件从业者所掌握和熟悉。“反编译技术”则是近几年得以迅速发展的新兴技术,许多计算机软件或信息安全从业者非常关心该项技术,但目前这方面的书籍较少,与“编译技术”结合起来讲解的更少。本书就是在这种需求以及编者在这两方面的科研实践体会的驱动下诞生的,目的是为计算机软件和信息安全从业者提供编译与反编译技术方面的知识和技能。 本书的编写得到了中国人民解放军信息工程大学和机械工业出版社的支持,在此表示诚挚的谢意。 本书由庞建民教授确定内容的选取和组织结构,由庞建民、陶红伟、刘晓楠、岳峰具体执笔,庞建民编写第1、9章,陶红伟编写第2、3、4、5、7章,刘晓楠编写第10、11、12、13章,岳峰编写第6、8、14、15章,最后由庞建民定稿。赵荣彩教授对本书的编写提出了许多宝贵的意见和建议,在此表示衷心的感谢。 本书力图反映编译与反编译及其相关领域的基础知识和发展方向,尝试用通用的语言讲述抽象的原理与技术,由于编者水平有限,书中难免有错误与欠妥之处,恳请读者批评指正。 编者 教学建议 教学内容 教学要点及教学要求 课时安排 计算机及安全专业 非计算机专业 教学内容 教学要点及教学要求 课时安排 计算机及安全专业 非计算机专业 第1章 引论 熟悉编译器和解释器的概念,掌握二者的区别。了解编译的过程,熟悉编译器的结构、编译器的分类及其生成方式、高级语言的分类及其特点,理解编译前端和后端的概念,掌握C语言程序的编译流程,了解UNIX/Linux环境中make和makefile的概念及其应用 2~4 2~3 (选讲) 第2章 词法分析的理论与实践 了解词法分析器的功能以及输出形式,熟悉词法分析器的结构和超前搜索技术。掌握状态转换图及其实现、正规式与正规文法、NFA与DFA、正规式与有穷自动机的关系以及DFA的最小化。了解词法分析器的自动产生工具及其使用 6~7 5~6 (选讲) 第3章 语法分析 掌握上下文无关文法的相关概念,理解自上而下语法分析的概念,掌握LL(1)分析法、左递归和回溯的消除方法,学会构造预测分析程序。理解自下而上语法分析的概念,掌握LR(0)分析、SLR(1)分析、LR(1)分析和LALR(1)分析。学会使用YACC工具 8~10 6~7 (选讲) 第4章 语义分析与 处理 理解语法制导定义和语法制导翻译模式的相关概念,理解语法制导翻译的基本思想。掌握属性计算的常用方法,包括基于依赖图的属性计算方法、基于树遍历的属性计算方法和基于一遍扫描的属性计算方法。掌握S-属性文法的自下而上计算、L-属性文法的自上而下翻译。理解中间语言的基本概念,掌握表达式的逆波兰表示法、DAG表示法、三地址代码。掌握说明语句的翻译、赋值语句的翻译、布尔表达式的翻译、控制语句的翻译和过程调用的处理 7~8 4~6 (选讲) 第5章 符号表 了解符号表的作用、内容、组织和实现等 1~2 1~2 (选讲) 第6章 运行时 存储组织 熟悉程序运行时的存储区域划分,掌握静态存储分配、动态存储分配的思想。充分理解栈式动态存储分配中简单的栈式存储分配的实现和嵌套过程语言的栈式实现,能够分析程序运行时的栈的变化情况。了解堆式动态存储分配的两种途径:定长块管理、变长块管理。熟悉并掌握存储分配存在的安全性问题,充分理解缓冲区溢出的原理,了解相关的防范方法 3~4 2~4 (选讲) 第7章 优化 理解优化和基本块的基本概念。掌握将三地址语句序列划分为基本块的算法和以基本块为结点的控制流图构造方法。掌握常用的局部优化技术,包括删除公共子表达式、复写传播、删除无用代码、合并已知量、常数传播等。掌握基于基本块的DAG的局部优化 掌握如何利用程序的控制流程图来定义和查找循环,掌握常用的循环优化技术,包括循环展开、代码外提、强度削弱和删除归纳变量 了解进行数据流分析的几种常用方法,包括到达–定值数据流分析、活跃变量数据流分析和可用表达式数据流分析等,了解如何利用上述数据流分析结果进行全局范围内常数传播、合并已知量、删除公共子表达式和复写传播 6~8 4~6 (选讲) 第8章 目标代码生成 熟悉并掌握代码生成器设计中的问题,掌握线性扫描的寄存器分配方法的思想,并充分理解线性扫描寄存器分配算法。了解图着色的寄存器分配算法的思想及典型的实现过程,熟悉并掌握窥孔优化的三种典型方法,能够分析简单的代码生成过程 5~6 3~4 (选讲) 第9章 多样化编译 了解软件多样化的需求,特别是安全方面的需求;掌握多变体代码的特点、执行环境。理解海量软件多样性的概念及其目的,掌握多样化编译所涉及的多项技术,了解多样化编译技术的实现和应用范围 2~4 1~2 (选讲) 第10章 反编译及其关键要素 熟悉并掌握反编译的概念,其与编译的关系,以及反编译器的构成。熟悉反编译的基本过程,了解反编译技术的发展历程。熟悉反编译技术的局限、先决条件和评价指标,了解反编译的应用领域和研究重点 4~5 2~4 (选讲) 第11章 反编译器的整体框架 熟悉并掌握经典的、纯粹的反编译器的框架设计,了解经典多源反编译框架的基本构成。了解两款以反编译器为核心的二进制翻译系统的框架构造,熟悉从单一功能的反编译器到支持多源平台的反编译器,乃至利用反编译技术实现的静态二进制翻译器的设计思路、基本技术、软件系统的构造和主要功能 3~4 2~3 第12章 反编译中的指令解码和语义描述与映射 熟悉并掌握二进制0/1代码向汇编码转换过程中的主要知识:指令描述和解码。熟悉并掌握汇编级代码向中间表示转换过程中的基本知识:指令的语义映射 3~4 1~3 (选讲) 第13章 反编译中的恢复技术 熟悉数据流(或数据)恢复的过程,掌握高级控制流恢复的基本方法。掌握从低级代码中识别并还原成高级语言中的过程和函数的主要方法 3~4 2~3 (选讲) 第14章 编译优化的反向处理 了解常用的编译优化方法,熟悉并掌握谓词执行的概念,掌握谓词消除的方法 3~4 2~3 (选讲) 第15章 反编译与信息安全 了解恶意代码检测的背景,熟悉并掌握反编译技术在三种层次上的行为提取方法。了解基于推理的程序恶意性分析系统及功能模块 4~6 3~4 教学总学时建议 60~80 40~60 说明: 1. 计算机或信息安全专业本科教学使用本教材时,建议课堂授课学时数为60 ~ 80(包含习题课、课堂讨论等必要的课堂教学环节,实验另行安排学时),不同学校可以根据各自的教学要求和计划学时数酌情对教材内容进行取舍。 2. 非计算机专业的师生使用本教材时可适当降低教学要求。若授课学时数少于60,建议主要学习第1章、第2章、第3章、第4章、第6章、第7章、第8章、第10章、第11章、第12章,第13章、第15章的内容可以适当简化,第5章、第9章、第14章可以不做要求。
编译与反编译技术 下载 mobi epub pdf txt 电子书 格式