内容简介
第47章 字符串剪切
47.1 x64下的MSVC 2013优化
47.2 x64下采用编辑器GCC 4.9.1进行非优化操作
47.3 x64下的GCC 4.9.1优化
47.4 ARM64:非优化的GCC(Linaro)4.9
47.5 ARM64:优化GCC(Linaro)4.9
47.6 ARM:Keil 6/2013优化(ARM模式)
47.7 ARM:Keil 6/2013(Thumb模式)优化
47.8 MIPS
第48章 toupper()函数
48.1 x64
48.1.1 两个比较操作
48.1.2 一个比较操作
48.2 ARM
48.2.1 ARM64下的GCC
48.3 总结
第49章 不正确的反汇编代码
49.1 x86环境下的从一开始错误的反汇编
49.2 随机噪音,怎么看起来像反汇编指令?
第50章 混淆技术
50.1 字符串变换
50.2 可执行代码
50.2.1 插入垃圾代码
50.2.2 用多个指令组合代替原来的一个指令
50.2.3 始终执行或者从来不会执行的代码
50.2.4 把指令序列搞乱
50.2.5 使用间接指针
50.3 虚拟机以及伪代码
50.4 一些其他的事情
50.5 练习题
50.5.1 练习1
第51章 C++
51.1 类
51.1.1 一个简单的例子
51.1.2 类继承
51.1.3 封装
51.1.4 多重继承
51.1.5 虚拟方法
51.2 ostream输出流
51.3 引用
51.4 STL/标准模板库(Standard Template Library)
51.4.1 std::string(字符串)
51.4.2 std::list
51.4.3 std::vector标准向量
51.4.4 std::map()和std::set()
第52章 数组与负数索引
第53章 16位的Windows程序
53.1 例子#1
53.2 例子#2
53.3 例子#3
53.4 例子#4
53.5 例子#5
53.6 例子#6
53.6.1 全局变量
第四部分 Java
第54章 Java
54.1 简介
54.2 返回一个值
54.3 简单的计算函数
54.4 JVM的内存模型
54.5 简单的函数调用
54.6 调用函数beep()(蜂鸣器)
54.7 线性同余随机数产生器(PRNG)
54.8 条件转移
54.9 传递参数
54.10 位操作
54.11 循环
54.12 switch()语句
54.13 数组
54.13.1 简单的例子
54.13.2 数组元素求和
54.13.3 输入变量为数组的主函数main()
54.13.4 预设初始值的的数组
54.13.5 可变参数函数
54.13.6 二维数组
54.13.7 三维数组
54.13.8 小结
54.14 字符串
54.14.1 第一个例子
54.14.2 第二个例子
54.15 异常处理
54.16 类
54.17 简单的补丁
54.17.1 第一个例子
54.17.2 第二个例子
54.18 总结
第五部分 在代码中发现重要而有趣的内容
第55章 编译器产生的文件特征
55.1 Microsoft Visual C++
55.1.1 命名规则
55.2 GCC编译器
55.2.1 命名规则
55.2.2 Cygwin
55.2.3 MinGW
55.3 Intel FORTRAN
55.4 Watcom以及OpenWatcom
55.4.1 命名规则
55.5 Borland编译器
55.5.1 Dephi编程语言
55.6 其他的已知DLL文件
第56章 Win32环境下与外部通信
56.1 在WindowsAPI中最经常使用的函数
56.2 tracer:解析指定模块的所有函数
第57章 字符串
57.1 字符串
57.1.1 C/C++中的字符串
57.1.2 Borland Delphi
57.1.3 Unicode编码
57.1.4 Base64
57.2 错误/调试信息
57.3 可疑的魔数字符串
第58章 调用宏assert()(中文称为断言)
第59章 常数
59.1 魔数
59.1.1 动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)
59.2 寻找常数
第60章 检索关键指令
第61章 可疑的代码模型
61.1 XOR异或指令
61.2 手写汇编代码
第62章 魔数与程序调试
第63章 其他的事情
63.1 总则
63.2 C++
63.3 部分二进制文件的特征
63.4 内存“快照”对比
63.4.1 Windows注册表
63.4.2 瞬变比较器Blink-comparator
第六部分 操作系统相关
第64章 参数的传递方法(调用规范)
64.1 cdecl[C Declaration的缩写]
64.2 stdcall[Standard Call的缩写]
64.2.1 带有可变参数的函数
64.3 fastcall
64.3.1 GCC regparm
64.3.2 Watcom/OpenWatcom
64.4 thiscall
64.5 64位下的x86
64.5.1 Windows x64
64.5.2 64位下的Linux
64.6 单/双精度数型返回值
64.7 修改参数
64.8 指针型函数参数
第65章 线程本地存储TLS
65.1 线性同余发生器(改)
65.1.1 Win32系统
65.1.2 Linux系统
第66章 系统调用(syscall-s)
66.1 Linux
66.2 Windows
第67章 Linux
67.1 位置无关的代码
67.1.1 Windows
67.2 在Linux下的LD_PRELOAD
第68章 Windows NT
68.1 CRT(Win32)
68.2 Win32 PE文件
68.2.1 术语
68.2.2 基地址
68.2.3 子系统
68.2.4 操作系统版本
68.2.5 段
68.2.6 重定向段Relocations(relocs)
68.2.7 导出段和导入段
68.2.8 资源段
68.2.9 .NET
68.2.10 TLS段
68.2.11 工具
68.2.12 更进一步
68.3 Windows SEH
68.3.1 让我们暂时把MSVC放在一边
68.3.2 让我们重新回到MSVC
68.3.3 Windows x64
68.3.4 关于SEH的更多信息
68.4 Windows NT:临界区段
第七部分 常用工具
第69章 反汇编工具
69.1 IDA
第70章 调试工具
70.1 tracer
70 2 OllyDbg
70.3 GDB
第71章 系统调用的跟踪工具
71.1 strace/dtruss
第72章 反编译工具
第73章 其他工具
第八部分 更多范例
第74章 修改任务管理器(Vista)
74.1 使用LEA指令赋值
第75章 修改彩球游戏
第76章 扫雷(Windows XP)
76.1 练习题
第77章 人工反编译与Z3 SMT求解法
77.1 人工反编译
77.2 Z3 SMT求解法
第78章 加密狗
78.1 例1:PowerPC平台的MacOS Classic程序
78.2 例2:SCO OpenServer
解密错误信息
78.3 例3:MS-DOS
第79章 “QR9”:魔方态加密模型
第80章 SAP
80.1 关闭客户端的网络数据包压缩功能
80.2 SAP 6.0的密码验证函数
第81章 Oracle RDBMS
81.1 V$VERSION表
81.2 X$KSMLRU表
81.3 V$TIMER表
第82章 汇编指令与屏显字符
82.1 EICAR
第83章 实例演示
83.1 10PRINT CHR$(205.5 +RND(1));:GOTO 10
83.1.1 Trixter的42字节程序
83.1.2 笔者对Trixter算法的改进:27字节
83.1.3 从随机地址读取随机数
83.1.4 其他
83.2 曼德博集合
83.2.1 理论
83.2.2 demo程序
83.2.3 笔者的改进版
第九部分 文件分析
第84章 基于XOR的文件加密
84.1 Norton Guide:单字节XOR加密实例
信息熵
84.2 4字节XOR加密实例
84.3 练习题
第85章 Millenium游戏的存档文件
第86章 Oracle的.SYM文件
第87章 Oracle的.MSDB文件
总结
第十部分 其他
第88章 npad
第89章 修改可执行文件
89.1 文本字符串
89.2 x86指令
第90章 编译器内部函数
第91章 编译器的智能短板
第92章 OpenMP
92.1 MSVC
92.2 GCC
第93章 安腾指令
第94章 8086的寻址方式
第95章 基本块重排
95.1 PGO的优化方式
第十一部分 推荐阅读
第96章 参考书籍
96.1 Windows
96.2 C/C++
96.3 x86/x86-64
96.4 ARM
96.5 加密学
第97章 博客
97.1 Windows平台
第98章 其他内容
第十二部分 练习题
第99章 初等难度练习题
99.1 练习题1.4
第100章 中等难度练习题
100.1 练习题2.1
100.1.1 Optimizing MSVC 2010 x86
100.1.2 Optimizing MSVC 2012 x64
100.2 练习题2.4
100.2.1 Optimizing MSVC 2010
100.2.2 GCC 4.4.1
100.2.3 Optimizing Keil(ARM mode)
100.2.4 Optimizing Keil(Thumb mode)
100.2.5 Optimizing GCC 4.9.1(ARM64)
100.2.6 Optimizing GCC 4.4.5(MIPS)
100.3 练习题2.6
100.3.1 Optimizing MSVC 2010
100.3.2 Optimizing Keil(ARM mode)
100.3.3 Optimizing Keil(Thumb mode)
100.3.4 Optimizing GCC 4.9.1(ARM64)
100.3.5 Optimizing GCC 4.4.5(MIPS)
100.4 练习题2.1 3
100.4.1 Optimizing MSVC 2012
100.4.2 Keil(ARM mode)
100.4.3 Keil(Thumb mode)
100.4.4 Optimizing GCC 4.9.1(ARM64)
100.4.5 Optimizing GCC 4.4.5(MIPS)
100.5 练习题2.1 4
100.5.1 MSVC 2012
100.5.2 Keil(ARM mode)
100.5.3 GCC 4.6.3 for Raspberry Pi(ARM mode)
100.5.4 Optimizing GCC 4.9.1(ARM64)
100.5.5 Optimizing GCC 4.4.5(MIPS)
100.6 练习题2.1 5
100.6.1 Optimizing MSVC 2012 x64
100.6.2 Optimizing GCC 4.4.6x64
100.6.3 Optimizing GCC 4.8.1 x86
100.6.4 Keil(ARM模式):面向Cortex-R4F CPU的代码
100.6.5 Optimizing GCC 4.9.1(ARM64)
100.6.6 Optimizing GCC 4.4.5(MIPS)
100.7 练习题2.1 6
100.7.1 Optimizing MSVC 2012x64
100.7.2 Optimizing Keil(ARM mode)
100.7.3 Optimizing Keil(Thumb mode)
100.7.4 Non-optimizing GCC 4.9.1(ARM64)
100.7.5 Optimizing GCC 4.9.1(ARM64)
100.7.6 Non-optimizing GCC 4.4.5(MIPS)
100.8 练习题2.17
100.9 练习题2.18
100.10 练习题2.19
100.11 练习题2.20
第101章 高难度练习题
101.1 练习题3.2
101.2 练习题3.3
101.3 练习题3.4
101.4 练习题3.5
101.5 练习题3.6
101.6 练习题3.8
第102章 Crackme/Keygenme
附录A x86
A.1 数据类型
A.2 通用寄存器
A.2.1 RAX/EAX/AX/AL
A.2.2 RBX/EBX/BX/BL
A.2.3 RCX/ECX/CX/CL
A.2.4 RDX/EDX/DX/DL
A.2.5 RSI/ESI/SI/SIL
A.2.6 RDI/EDI/DI/DIL
A.2.7 R8/R8D/R8W/R8L
A.2.8 R9/R9D/R9W/R9L
A.2.9 R10/R10D/R10W/R10L
A.2.10 R11/R11D/R11W/R11L
A.2.11 R12/R12D/R12W/R12L
A.2.12 R13/R13D/R13W/R13L
A.2.13 R14/R14D/R14W/R14L
A.2.14 R15/R15D/R15W/R15L
A.2.15 RSP/ESP/SP/SPL
A.2.16 RBP/EBP/BP/BPL
A.2.17 RIP/EIP/IP
A.2.18 段地址寄存器CS/DS/ES/SS/FS/GS
A.2.19 标识寄存器
A.3 FPU寄存器
A.3.1 控制字寄存器(16位)
A.3.2 状态字寄存器(16位)
A.3.3 标记字寄存器(16位)
A.4 SIMD寄存器
A.4.1 MMX寄存器
A.4.2 SSE与AVX寄存器
A.5 FPU调试寄存器
A.5.1 DR6规格
A.5.2 DR7规格
A.6 指令
A.6.1 指令前缀
A.6.2 常见指令
A.6.3 不常用的汇编指令
A.6.4 FPU指令
A.6.5 可屏显的汇编指令(32位)
附录B ARM
B.1 术语
B.2 版本差异
B.3 32位ARM(AArch32)
B.3.1 通用寄存器
B.3.2 程序状态寄存器/CPSR
B.3.3 VFP(浮点)和NEON寄存器
B.4 64位ARM(AArch64)
通用寄存器
B.5 指令
Conditional codes速查表
附录C MIPS
C.1 寄存器
C.1.1 通用寄存器GPR
C.1.2 浮点寄存器FPR
C.2 指令
转移指令
附录D 部分GCC库函数
附录E 部分MSVC库函数
附录F 速查表
F.1 IDA
F.2 OllyDbg
F.3 MSVC选项
F.4 GCC
F.5 GDB
附录G 练习题答案
G.1 各章练习
第3章
第5章
第7章
第13章
第14章
第15章
第16章
第17章
第18章
第19章
第21章
第41章
第50章
G.2 初级练习题
G2.1 练习题1.1
G2.2 练习题1.4
G.3 中级练习题
G3.1 练习题2.1
G3.2 练习题2.4
G3.3 练习题2.6
G3.4 练习题2.13
G3.5 练习题2.14
G3.6 练习题2.15
G3.7 练习题2.16
G3.8 练习题2.17
G3.9 练习题2.18
G3.10 练习题2.19
G3.11 练习题2.20
G.4 高难度练习题
G4.1 练习题3.2
G4.2 练习题3.3
G4.3 练习题3.4
G4.4 练习题3.5
G4.5 练习题3.6
G4.6 练习题3.8
G.5 其他练习题
G5.1 “扫雷(Windows XP)”
参考文献