表目录 | 第9-10页 |
图目录 | 第10-13页 |
摘要 | 第13-15页 |
ABSTRACT | 第15-16页 |
第一章 绪论 | 第17-29页 |
1.1 代码移植概述 | 第17页 |
1.2 二进制翻译 | 第17-26页 |
1.2.1 二进制翻译的分类 | 第18-19页 |
1.2.1.1 根据实现方法 | 第18页 |
1.2.1.2 根据待翻译对象 | 第18页 |
1.2.1.3 根据源和目标平台 | 第18-19页 |
1.2.2 二进制翻译与反编译的关系 | 第19页 |
1.2.3 发展历史 | 第19-25页 |
1.2.3.1 二进制翻译技术发展历史 | 第19-23页 |
1.2.3.2 反编译技术发展历史 | 第23-25页 |
1.2.4 面临的难点问题 | 第25-26页 |
1.3 研究内容及创新点 | 第26-27页 |
1.4 本文组织结构 | 第27-29页 |
第二章 IA-64 体系结构及ITS静态二进制翻译系统 | 第29-45页 |
2.1 IA-64 体系结构概述 | 第29-35页 |
2.1.1 EPIC(Explicitly Parallel Instruction Computing)技术 | 第29-30页 |
2.1.2 寄存器资源 | 第30-31页 |
2.1.3 指令格式 | 第31-33页 |
2.1.3.1 指令包 | 第31页 |
2.1.3.2 指令位字段格式 | 第31-32页 |
2.1.3.3 指令类型 | 第32页 |
2.1.3.4 指令模板 | 第32-33页 |
2.1.4 投机 | 第33-34页 |
2.1.5 数据模型 | 第34-35页 |
2.1.6 内存堆栈 | 第35页 |
2.1.7 过程链接 | 第35页 |
2.1.8 全局指针 | 第35页 |
2.2 ITS静态二进制翻译系统 | 第35-42页 |
2.2.1 指令解码器 | 第36-38页 |
2.2.1.1 编码解码描述语言SLED | 第36-37页 |
2.2.1.2 使用MLTK进行解码 | 第37-38页 |
2.2.2 语义映射器 | 第38页 |
2.2.3 通用分析器 | 第38页 |
2.2.4 C代码生成器 | 第38-39页 |
2.2.5 实验结果及分析 | 第39-42页 |
2.2.5.1 测试环境介绍 | 第39-40页 |
2.2.5.2 实验结果 | 第40-41页 |
2.2.5.3 结果分析 | 第41-42页 |
2.3 亚纯静态二进制翻译系统 | 第42-44页 |
2.4 小结 | 第44-45页 |
第三章 基于功能块的程序分析 | 第45-57页 |
3.1 分析单位 | 第45-46页 |
3.2 基于基本块的分析 | 第46-51页 |
3.2.1 能胜任的情况 | 第47-49页 |
3.2.2 不能胜任的情况 | 第49-51页 |
3.3 功能块 | 第51-53页 |
3.3.1 功能块的定义 | 第51-52页 |
3.3.2 功能块的划分算法 | 第52-53页 |
3.4 实验结果 | 第53-56页 |
3.5 小结 | 第56-57页 |
第四章 间接转移指令目标地址的确定 | 第57-73页 |
4.1 引言 | 第57-58页 |
4.2 无法处理的代码 | 第58-59页 |
4.3 程序执行路径的逆向构造 | 第59-68页 |
4.3.1 间接点的提取 | 第59-61页 |
4.3.2 逆向构造需要解决的相关问题及分析 | 第61-66页 |
4.3.2.1 间接转移指令间的关系 | 第61-62页 |
4.3.2.2 控制结构 | 第62-64页 |
4.3.2.3 条件冗余 | 第64页 |
4.3.2.4 路径中的环 | 第64-65页 |
4.3.2.5 内存一致性 | 第65-66页 |
4.3.3 执行路径逆向构造算法 | 第66-68页 |
4.4 逆向构造执行路径的控制执行 | 第68-69页 |
4.5 实验结果 | 第69-71页 |
4.6 小结 | 第71-73页 |
第五章 自修改代码的处理 | 第73-86页 |
5.1 引言 | 第73页 |
5.2 研究现状 | 第73-75页 |
5.3 自修改代码的分析与处理 | 第75-81页 |
5.3.1 自修改保护机制 | 第75页 |
5.3.2 处理策略 | 第75-79页 |
5.3.2.1 内存一致性更新 | 第76-78页 |
5.3.2.1.1 线性依赖关系 | 第77-78页 |
5.3.2.1.2 非线性依赖关系 | 第78页 |
5.3.2.2 程序状态的保存与恢复 | 第78-79页 |
5.3.3 自修改代码处理算法 | 第79-81页 |
5.3.4 局限性 | 第81页 |
5.4 试验结果 | 第81-84页 |
5.5 小结 | 第84-86页 |
第六章 数据类型的恢复 | 第86-103页 |
6.1 引言 | 第86页 |
6.2 研究现状 | 第86-88页 |
6.3 C语言的数据类型 | 第88-94页 |
6.3.1 数据类型介绍 | 第88页 |
6.3.2 涉及的IA-64 特性 | 第88-89页 |
6.3.3 数据类型在IA-64 上的表现特性 | 第89-94页 |
6.3.3.1 无符号整型 | 第90-91页 |
6.3.3.2 字符串 | 第91页 |
6.3.3.3 double数据类型 | 第91页 |
6.3.3.4 long double数据类型 | 第91-92页 |
6.3.3.5 enum数据类型 | 第92页 |
6.3.3.6 struct数据类型 | 第92-93页 |
6.3.3.7 union数据类型 | 第93页 |
6.3.3.8 数组数据类型 | 第93页 |
6.3.3.9 指针数据类型 | 第93-94页 |
6.3.4 数据类型对应的存取操作码 | 第94页 |
6.4 数据类型恢复 | 第94-100页 |
6.4.1 需要解决的问题及处理方法 | 第95-97页 |
6.4.1.1 寄存器和内存操作 | 第95-96页 |
6.4.1.2 数组和struct数据类型 | 第96页 |
6.4.1.3 union数据类型 | 第96-97页 |
6.4.1.4 存取操作码对应的数据类型 | 第97页 |
6.4.2 数据类型恢复的基本思想 | 第97-99页 |
6.4.3 数据类型恢复算法 | 第99-100页 |
6.5 实验结果 | 第100-102页 |
6.6 小结 | 第102-103页 |
第七章 用户函数与库函数同名的区分 | 第103-115页 |
7.1 引言 | 第103页 |
7.2 函数同名问题 | 第103-105页 |
7.2.1 函数同名问题描述 | 第103-104页 |
7.2.2 函数同名问题分析 | 第104-105页 |
7.3 库函数识别流程解析 | 第105-106页 |
7.4 ELF64 格式二进制文件 | 第106-110页 |
7.4.1 ELF64 文件的header | 第107-108页 |
7.4.2 ELF64 文件中的表 | 第108-109页 |
7.4.3 ELF64 文件中的代码组织 | 第109-110页 |
7.5 函数同名问题的解决方案 | 第110-114页 |
7.5.1 基于动态链接符号表的函数同名问题分析 | 第111-113页 |
7.5.2 基于动态链接符号表的同名问题区分算法 | 第113-114页 |
7.6 小结 | 第114-115页 |
第八章 制导信息提取系统的设计与实现 | 第115-126页 |
8.1 制导信息提取系统的设计 | 第115-118页 |
8.2 制导信息提取系统的实现 | 第118-123页 |
8.2.1 CGIPS系统使用的命令 | 第119-120页 |
8.2.2 CGIPS系统使用的数据结构 | 第120-123页 |
8.3 实验结果 | 第123-125页 |
8.4 小结 | 第125-126页 |
结束语 | 第126-128页 |
参考文献 | 第128-136页 |
附录Ⅰ 程序total_test.c | 第136-138页 |
附录Ⅱ 可执行程序total_test对应的线性扫描反汇编代码 | 第138-146页 |
附录Ⅲ 从total_test中提取出的全局数据及数据类型 | 第146-149页 |
附录Ⅳ 可执行程序total_test对应的制导文件 | 第149-154页 |
附录Ⅴ 静态翻译total_test生成的C程序 | 第154-157页 |
作者简历 攻读博士学位期间完成的主要工作 | 第157-158页 |
致谢 | 第158页 |