第1章 基础知识 1
1.1 文本编码方式 1
1.2 Windows API函数 2
1.2.1 Win API简介 2
1.2.2 什么是句柄 4
1.2.3 常用Win32 API函数 4
1.3 Windows与Unicode 7
1.3.1 Windows9x与Unicode 7
1.3.2 Windows2000/XP与Unicode 9
1.4 Windows消息机制 9
1.5 Windows注册表 12
1.5.1 注册表的逻辑结构 12
1.5.2 注册表相关函数 13
1.5.3 注册表分析软件 15
1.6 保护模式简介 17
1.6.1 虚拟内存 18
1.6.2 保护模式的权限级别 19
第2章 代码分析技术 21
2.1 认识PE格式 21
2.1.1 PE格式 21
2.1.2 文件偏移地址与虚拟地址转换 23
2.2 代码指令 25
2.2.1 转移指令机器码的计算 25
2.2.2 条件设置指令 28
2.2.3 指令修改技巧 29
2.2.4 浮点指令 30
2.3 逆向分析技术 33
2.3.1 函数 33
2.3.2 循环 37
2.3.3 控制语句 38
2.3.4 全局变量 38
2.3.5 字串初始化 39
第3章 静态分析技术 40
3.1 文件类型分析 40
3.1.1 Filelnfo工具 40
3.1.2 PEiD工具 41
3.2 资源 42
3.2.1 资源黑客的使用 42
3.2.2 eXeScope的使用 44
3.3 W32Dasm使用介绍 44
3.3.1 准备工作 44
3.3.2 操作步骤 46
3.3.3 代码清单的阅读 52
3.4 IDA Pro使用简介 57
3.4.1 IDA文件 58
3.4.2 IDA配置文件 58
3.4.3 IDA菜单选项配置 60
3.4.4 打开文件 62
3.4.5 IDA主窗口界面 63
3.4.6 注释 64
3.4.7 交叉参考 64
3.4.8 查找字符串 65
3.4.9 参考重命名 65
3.4.10 标签的用法 66
3.4.11 进制的转换 67
3.4.12 手工识别代码和数据 67
3.4.13 数组(Arrays) 68
3.4.14 结构体(Structures) 68
3.4.15 枚举类型(Enumerated Types) 70
3.4.16 堆栈变量 71
3.4.17 IDC脚本 72
3.4.18 FLIRT 77
3.4.19 插件 78
3.4.20 输出 79
3.4.21 小结 80
3.5 文件编辑工具 80
3.5.1 Hiew使用 80
3.5.2 HexWorkshop使用 85
3.5.3 WinHex使用 87
3.6 静态分析技术应用实例 88
3.6.1 解密初步 88
3.6.2 逆向工程初步 89
第4章 动态分析技术 92
4.1 SoftICE调试器 92
4.1.1 安装 92
4.1.2 调试窗口简介 99
4.1.3 窗口操作 102
4.1.4 SoftICE配置 105
4.1.5 SoftICE常用命令简介 111
4.1.6 SoftICE调试技术 115
4.1.7 SoftICE的符号调试技术 123
4.1.8 断点 132
4.1.9 SoftICE远程调试 139
4.1.10 IceDump和NticeDump的使用 144
4.2 TRW2000调试器 150
4.2.1 安装 150
4.2.2 配置 150
4.2.3 输出信息(Export)的装载 151
4.2.4 TRW2000操作 151
4.2.5 条件断点 153
4.2.6 符号调试 154
4.3 OllyDbg调试器 154
4.3.1 OllyDbg界面 154
4.3.2 基本操作 156
4.3.3 实例 157
4.4 常见问题小结 158
第5章 软件保护技术及其弱点 160
5.1 序列号保护方式 160
5.1.1 序列号保护机制 160
5.1.2 如何攻击序列号保护 162
5.1.3 字符处理代码分析 164
5.1.4 注册机制作 167
5.1.5 浮点数 172
5.2 警告(Nag)窗口 175
5.3 时间限制 177
5.3.1 计时器 177
5.3.2 时间限制 179
5.3.3 拆解时间限制保护 180
5.4 菜单功能限制 182
5.4.1 相关函数 182
5.4.2 拆解菜单限制保护 183
5.5 Key File保护 183
5.5.1 相关API函数 183
5.5.2 拆解Key File的一般思路 185
5.5.3 文件监视工具FileMon 185
5.5.4 拆解KeyFile保护 187
5.6 CD-Check 192
5.6.1 相关函数 192
5.6.2 拆解光盘保护 194
5.7 只运行一个实例 194
5.7.1 实现方案 195
5.7.2 实例 196
5.8 常用断点设置技巧 196
5.9 关于软件保护的一般性建议 197
第6章 加密算法 199
6.1 单向散列算法 199
6.1.1 MD5算法 199
6.1.2 SHA算法 201
6.1.3 CRC算法 203
6.2 公开密钥算法 206
6.2.1 RSA算法 206
6.2.2 EIGamal算法 212
6.2.3 DSA算法 217
6.3 对称算法 218
6.3.1 BlowFish算法 218
6.4 其他算法 221
6.4.1 Base64编码 221
6.4.2 Crypto API 222
6.5 小结 224
第7章 反编译语言 225
7.1 Viual Basic程序 225
7.1.1 Visual Basic字符编码方式 225
7.1.2 VB3和VB4反编译 226
7.1.3 动态分析VB3和VB4程序 226
7.1.4 动态分析VB5和VB6程序 229
7.1.5 SmartCheck调试工具 236
7.1.6 伪编译(P-code) 241
7.2 Delphi/C++Builder程序 250
7.2.1 认识Delphi 250
7.2.2 DeDe反编译器 250
7.2.3 断点 256
7.3 Java程序 257
7.3.1 JVM指令系统 258
7.3.2 JVM寄存器 258
7.3.3 JVM堆栈结构 258
7.3.4 JVM碎片回收堆 258
7.3.5 JVM存储区 259
7.4 InstallShield反编译 262
7.4.1 安装文件构成 262
7.4.2 脚本语言反编译 262
7.4.3 IS解密 263
第8章 PE文件格式 265
8.1 PE文件结构 265
8.1.1 PE的基本概念 265
8.1.2 DOS插桩程序 267
8.1.3 PE文件头(IMAGENTHEADERS) 268
8.1.4 块表(The Section Table) 274
8.1.5 各种块(Sections)的描述 276
8.1.6 输入表(Import Table) 277
8.1.7 绑定输入(Bound Import) 284
8.1.8 输出表(Export Table) 285
8.1.9 基址重定位表(Base ReloCation Table) 287
8.1.10 资源 290
8.1.11 PE格式小结 292
8.2 PE编辑工具 292
8.2.1 LordPE使用简介 292
8.2.2 PEditor使用简介 295
第9章 增加PE文件功能 296
9.1 数据对齐 296
9.2 增加区块(Section) 296
9.2.1 手工构造区块 297
9.2.2 工具辅助构造区块 298
9.3 增加输入函数 298
9.3.1 手工增加 298
9.3.2 工具辅助 299
9.4 增加DLL文件 300
9.5 窗口函数 301
9.6 增加菜单功能 304
9.6.1 扩充WndProc 305
9.6.2 Exit菜单 305
9.6.3 Open菜单 306
9.6.4 Save菜单 309
9.7 用DLL增加功能 313
9.7.1 创建DLL文件 313
9.7.2 调用DLL函数 313
9.8 修复基址重定位表 314
9.9 增加输出函数 317
9.10 扩充输出函数功能 318
第10章 反跟踪技术 319
10.1 结构化异常处理 319
10.1.1 异常列表 319
10.1.2 SEH异常处理 320
10.1.3 异常信息 322
10.1.4 系统异常调试程序 325
10.1.5 异常处理回调函数 327
10.2 反调试技术 330
10.3 花指令 339
10.4 反-反调试技术 344
10.4.1 SuperBPM 344
10.4.2 FrogsICE 344
10.4.3 在Windows2000/XP下隐藏SoftICE 348
10.5 反跟踪实例 349
10.5.1 Anti-SoftICE 349
10.5.2 Anti-Spy 350
10.5.3 Anti-DeDe 351
第11章 加壳与脱壳 353
11.1 认识壳 353
11.1.1 壳的概念 353
11.1.2 壳的加载过程 354
11.2 加壳工具 355
11.2.1 ASPack 356
11.2.2 UPX 357
11.2.3 PECompact 357
11.2.4 ASProtect 358
11.2.5 tElock 359
11.2.6 幻影(DBPE) 359
11.3 专用脱壳软件 359
11.3.1 ASPack 360
11.3.2 UPX 360
11.3.3 ASProtect 361
11.4 通用脱壳软件 361
11.4.1 ProcDump使用简介 362
11.4.2 File Scanner使用简介 368
11.5 手动脱壳 369
11.5.1 查找入口点 369
11.5.2 抓取内存映像文件 372
11.5.3 重建输入表 375
11.5.4 ImportREC使用指南 379
11.5.5 Revirgin使用指南 385
11.5.6 重建可编辑资源 389
11.6 压缩保护的壳 389
11.6.1 ASPack的壳 389
11.6.2 PECompact的壳 394
11.6.3 PE-PaCK的壳 397
11.6.4 Petite的壳 401
11.7 加密保护的壳 403
11.7.1 ASProtect加密保护 403
11.7.2 tElock加密保护 416
11.8 DLL文件 423
11.8.1 ASPack的壳 424
11.8.2 PECompact的壳 427
11.8.3 UPX的壳 431
11.8.4 ASProtect的壳 434
11.8.5 tElock的壳 435
11.9 脱壳小结 437
第12章 补丁技术 439
12.1 补丁原理 439
12.1.1 文件补丁 439
12.1.2 内存补丁 441
12.2 补丁工具 443
12.2.1 文件补丁工具 443
12.2.2 内存补丁工具 445
12.3 SMC补丁技术 445
12.3.1 单层SMC技术 446
12.3.2 多层SMC技术 447
12.3.3 SMC函数 449
第13章 商用软件保护技术 451
13.1 软件狗(Dongles) 451
13.1.1 软件狗介绍 451
13.1.2 软件狗厂商 452
13.1.3 软件狗的弱点 453
13.2 Vbox保护技术 454
13.2.1 Vbox4.03版本 454
13.2.2 Vbox4.2版本 456
13.2.3 Vbox4.3版本 458
13.3 SalesAgent保护技术 459
13.3.1 从“现在购买(BUY NOW)”入手 459
13.3.2 暴力去除SalesAgent的保护 461
13.4 SoftSENTRY保护技术 462
13.5 TimeLOCK保护技术 464
13.6 Flexlm保护 466
13.6.1 License文件格式 466
13.6.2 设置环境变量 468
13.6.3 Flexlm Server 469
13.6.4 FlexGen工具用法 470
13.6.5 利用FlexLm SDK解密 472
附录A 浮点指令 477
附录B SoftICE指令手册 480
附录C TRW2000指令手册 517
参考文献 520