描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787115350183丛书名: 图灵程序设计丛书
编辑推荐
书中用到的几乎所有示例都基于作者在逆向分析实践中获得的知识与经验,是其亲自开发的程序,紧扣各章主题,绝无累赘。
作者将培训经验应用到本书的组织结构、内容讲解、示例选择等各方面,以求将较为难懂的技术以更易懂的方式呈现给各位。
作者几年前就开设了一个逆向技术学习博客并运营至今,通过与访问者之间的交流,充分了解了初学者们的困惑和需求。
作者将培训经验应用到本书的组织结构、内容讲解、示例选择等各方面,以求将较为难懂的技术以更易懂的方式呈现给各位。
作者几年前就开设了一个逆向技术学习博客并运营至今,通过与访问者之间的交流,充分了解了初学者们的困惑和需求。
内容简介
《逆向工程核心原理》十分详尽地介绍了代码逆向分析的核心原理。作者在Ahnlab 研究所工作多年,书中不仅包括其以此经验为基础亲自编写的大量代码,还包含了逆向工程研究人员必须了解的各种技术和技巧。彻底理解并切实掌握逆向工程这门技术,就能在众多IT相关领域进行拓展运用,这本《逆向工程核心原理》就是通向逆向工程大门的捷径。
想成为逆向工程研究员的读者或正在从事逆向开发工作的开发人员一定会通过《逆向工程核心原理》获得很大帮助。同时,想成为安全领域专家的人也可从《逆向工程核心原理》轻松起步。
想成为逆向工程研究员的读者或正在从事逆向开发工作的开发人员一定会通过《逆向工程核心原理》获得很大帮助。同时,想成为安全领域专家的人也可从《逆向工程核心原理》轻松起步。
目 录
第一部分 代码逆向技术基础
第1章 关于逆向工程
1.1 逆向工程
1.2 代码逆向工程
1.2.1 逆向分析法
1.2.2 源代码、十六进制代码、汇编代码
1.2.3.“打补丁”与“破解”
1.3 代码逆向准备
1.3.1 目标
1.3.2 激情
1.3.3 谷歌
1.4 学习逆向分析技术的禁忌
1.4.1 贪心
1.4.2 急躁
1.5 逆向分析技术的乐趣
第2章 逆向分析Hello.World!程序
2.1 Hello.World!程序
2.2 调试HelloWorld.exe程序
2.2.1 调试目标
2.2.2 开始调试
2.2.3 入口点
2.2.4 跟踪40270C函数
2.2.5 跟踪40104F跳转语句
2.2.6 查找main()函数
2.3 进一步熟悉调试器
2.3.1 调试器指令
2.3.2.“大本营”
2.3.3 设置“大本营”的四种方法
2.4 快速查找指定代码的四种方法
2.4.1 代码执行法
2.4.2 字符串检索法
2.4.3 API检索法(1):在调用代码中设置断点
2.4.4 API检索法(2):在API代码中设置断点
2.5 使用“打补丁”方式修改“Hello.World!”字符串
2.5.1.“打补丁”
2.5.2 修改字符串的两种方法
2.6 小结
第3章 小端序标记法
3.1 字节序
3.1.1 大端序与小端序
3.1.2 在OllyDbg中查看小端序
第4章 IA-32寄存器基本讲解
4.1 什么是CPU寄存器
4.2 IA-32寄存器
4.3 小结
第5章 栈
5.1 栈
5.1.1 栈的特征
5.1.2 栈操作示例
第6章 分析abex’.crackme#1
6.1 abex’.crackme.#1
6.1.1 开始调试
6.1.2 分析代码
6.2 破解
6.3 将参数压入栈
6.4 小结
第7章 栈帧
7.1 栈帧
7.2 调试示例:stackframe.exe
7.2.1 StackFrame.cpp
7.2.2 开始执行main()函数&生成栈帧
7.2.3 设置局部变量
7.2.4 add()函数参数传递与调用
7.2.5 开始执行add()函数&生成栈帧
7.2.6 设置add()函数的局部变量(x,.y)
7.2.7 ADD运算
7.2.8 删除函数add()的栈帧&函数执行完毕(返回)
7.2.9 从栈中删除函数add()的参数(整理栈)
7.2.10 调用printf()函数
7.2.11 设置返回值
7.2.12 删除栈帧&main()函数终止
7.3 设置OllyDbg选项
7.3.1 Disasm选项
7.3.2 Analysis1选项
7.4 小结
第8章 abex’.crackme.#2
8.1 运行abex’.crackme.#2
8.2 Visual.Basic文件的特征
8.2.1 VB专用引擎
8.2.2 本地代码和伪代码
8.2.3 事件处理程序
8.2.4 未文档化的结构体
8.3 开始调试
8.3.1 间接调用
8.3.2 RT_MainStruct结构体
8.3.3 ThunRTMain()函数
8.4 分析crackme
8.4.1 检索字符串
8.4.2 查找字符串地址
8.4.3 生成Serial的算法
8.4.4 预测代码
8.4.5 读取Name字符串的代码
8.4.6 加密循环
8.4.7 加密方法
8.5 小结
第9章 Process.Explorer——最优秀的进程管理工具
9.1 Process.Explorer
9.2 具体有哪些优点呢
9.3 sysinternals
第10章 函数调用约定
10.1 函数调用约定
10.1.1 cdecl
10.1.2 stdcall
10.1.3 fastcall
第11章 视频讲座
11.1 运行
11.2 分析
11.2.1 目标(1):去除消息框
11.2.2 打补丁(1):去除消息框
11.2.3 目标(2):查找注册码
11.3 小结
第12章 究竟应当如何学习代码逆向分析
12.1 逆向工程
12.1.1 任何学习都应当有目标
12.1.2 拥有积极心态
12.1.3 要感受其中的乐趣
12.1.4 让检索成为日常生活的一部分
12.1.5 最重要的是实践
12.1.6 请保持平和的心态
第二部分 PE文件格式
第13章 PE文件格式
13.1 介绍
13.2 PE文件格式
13.2.1 基本结构
13.2.2 VA&RVA
13.3 PE头
13.3.1 DOS头
13.3.2 DOS存根
13.3.3 NT头
13.3.4 NT头:文件头
13.3.5 NT头:可选头
13.3.6 节区头
13.4 RVA.to.RAW
13.5 IAT
13.5.1 DLL
13.5.2 IMAGE_IMPORT_DESCRIPTOR
13.5.3 使用notepad.exe练习
13.6 EAT
13.6.1 IMAGE_EXPORT_DIRECTORY
13.6.2 使用kernel32.dll练习
13.7 高级PE
13.7.1 PEView.exe
13.7.2 Patched.PE
13.8 小结
第14章 运行时压缩
14.1 数据压缩
14.1.1 无损压缩
14.1.2 有损压缩
14.2 运行时压缩器
14.2.1 压缩器
14.2.2 保护器
14.3 运行时压缩测试
第15章 调试UPX压缩的notepad程序
15.1 notepad.exe的EP代码
15.2 notepad_upx.exe的EP代码
15.3 跟踪UPX文件
15.3.1 OllyDbg的跟踪命令
15.3.2 循环.#1
15.3.3 循环.#2
15.3.4 循环.#3
15.3.5 循环.#4
15.4 快速查找UPX.OEP的方法
15.4.1 在POPAD指令后的JMP指令处设置断点
15.4.2 在栈中设置硬件断点
15.5 小结
第16章 基址重定位表
16.1 PE重定位
16.1.1 DLL/SYS
16.1.2 EXE
16.2 PE重定位时执行的操作
16.3 PE重定位操作原理
16.3.1 基址重定位表
16.3.2 IMAGE_BASE_RELOCATION结构体
16.3.3 基址重定位表的分析方法
16.3.4 练习
第17章 从可执行文件中删除.reloc节区
17.1 .reloc节区
17.2 reloc.exe
17.2.1 删除.reloc节区头
17.2.2 删除.reloc节区
17.2.3 修改IMAGE_FILE_HEADER
17.2.4 修改IMAGE_OPTIONAL_HEADER
17.3 小结
第18章 UPack.PE文件头详细分析
18.1 UPack说明
18.2 使用UPack压缩notepad.exe
18.3 使用Stud_PE工具
18.4 比较PE文件头
18.4.1 原notepad.exe的PE文件头
18.4.2 notepad_upack.exe运行时压缩的PE文件头
18.5 分析UPack的PE文件头
18.5.1 重叠文件头
18.5.2 IMAGE_FILE_HEADER.SizeOfOptionalHeader
18.5.3 IMAGE_OPTIONAL_HEADER.NumberOf-RvaAndSizes
18.5.4 IMAGE_SECTION_HEADER
18.5.5 重叠节区
18.5.6 RVA.to.RAW
18.5.7 导入表(IMAGE_IMPORT_DESCRIPTOR.array)
18.5.8 导入地址表
18.6 小结
第19章 UPack调试?.查找OEP
19.1 OllyDbg运行错误
19.2 解码循环
19.3 设置IAT
19.4 小结
第20章 “内嵌补丁”练习
20.1 内嵌补丁
20.2 练习:Patchme
20.3 调试:查看代码流
20.4 代码结构
20.5.“内嵌补丁”练习
20.5.1 补丁代码要设置在何处呢
20.5.2 制作补丁代码
20.5.3 执行补丁代码
20.5.4 结果确认
第三部分 DLL注入
第21章 Windows消息钩取
21.1 钩子
21.2 消息钩子
21.3 SetWindowsHookEx()
21.4 键盘消息钩取练习
21.4.1 练习示例HookMain.exe
21.4.2 分析源代码
21.5 调试练习
21.5.1 调试HookMain.exe
21.5.2 调试Notepad.exe进程内的KeyHook.dll
21.6 小结
第22章 恶意键盘记录器
22.1 恶意键盘记录器的目标
22.1.1 在线游戏
22.1.2 网上银行
22.1.3 商业机密泄露
22.2 键盘记录器的种类与发展趋势
22.3 防范恶意键盘记录器
22.4 个人信息
第23章 DLL注入
23.1 DLL注入
23.2 DLL注入示例
23.2.1 改善功能与修复Bug
23.2.2 消息钩取
23.2.3 API钩取
23.2.4 其他应用程序
23.2.5 恶意代码
23.3 DLL注入的实现方法
23.4 CreateRemoteThread()
23.4.1 练习示例myhack.dll
23.4.2 分析示例源代码
23.4.3 调试方法
23.5 AppInit_DLLs
23.5.1 分析示例源码
23.5.2 练习示例myhack2.dll
23.6 SetWindowsHookEx()
23.7 小结
第24章 DLL卸载
24.1 DLL卸载的工作原理
24.2 实现DLL卸载
24.2.1 获取进程中加载的DLL信息
24.2.2 获取目标进程的句柄
24.2.3 获取FreeLibrary().API地址
24.2.4 在目标进程中运行线程
24.3 DLL卸载练习
24.3.1 复制文件及运行notepad.exe
24.3.2 注入myhack.dll
24.3.3 卸载myhack.dll
第25章 通过修改PE加载DLL
25.1 练习文件
25.1.1 TextView.exe
25.1.2 TextView_patched.exe
25.2 源代码.-.myhack3.cpp
25.2.1 DllMain()
25.2.2 DownloadURL()
25.2.3 DropFile()
25.2.4 dummy()
25.3 修改TextView.exe文件的准备工作
25.3.1 修改思路
25.3.2 查看IDT是否有足够空间
25.3.3 移动IDT
25.4 修改TextView.exe
25.4.1 修改导入表的RVA值
25.4.2 删除绑定导入表
25.4.3 创建新IDT
25.4.4 设置Name、INT、IAT
25.4.5 修改IAT节区的属性值
25.5 检测验证
25.6 小结
第26章 PE.Tools
26.1 PE.Tools
26.1.1 进程内存转储
26.1.2 PE编辑器
26.2 小结
第27章 代码注入
27.1 代码注入
27.2 DLL注入与代码注入
27.3 练习示例
27.3.1 运行notepad.exe
27.3.2 运行CodeInjection.exe
27.3.3 弹出消息框
27.4 CodeInjection.cpp
27.4.1 main()函数
27.4.2 ThreadProc()函数
27.4.3 InjectCode()函数
27.5 代码注入调试练习
27.5.1 调试notepad.exe
27.5.2 设置OllyDbg选项
27.5.3 运行CodeInjection.exe
27.5.4 线程开始代码
27.6 小结
第28章 使用汇编语言编写注入代码
28.1 目标
28.2 汇编编程
28.3 OllyDbg的汇编命令
28.3.1 编写ThreadProc()函数
28.3.2 保存文件
28.4 编写代码注入程序
28.4.1 获取ThreadProc()函数的二进制代码
28.4.2 CodeInjection2.cpp
28.5 调试练习
28.5.1 调试notepad.exe
28.5.2 设置OllyDbg选项
28.5.3 运行CodeInjection2.exe
28.5.4 线程起始代码
28.6 详细分析
28.6.1 生成栈帧
28.6.2 THREAD_PARAM结构体指针
28.6.3.“User32.dll”字符串
28.6.4 压入“user32.dll”字符串参数
28.6.5 调用LoadLibraryA(“user32.dll”)
28.6.6.“MessageBoxA”字符串
28.6.7 调用GetProcAddress(hMod,“MessageBoxA”)
28.6.8 压入MessageBoxA()函数的参数.1.-MB_OK
28.6.9 压入MessageBoxA()函数的参数.2.-“ReverseCore”
28.6.10 压入MessageBoxA()函数的参数.3.-“www.reversecore.com”
28.6.11 压入MessageBoxA()函数的参数.4.-NULL
28.6.12 调用MessageBoxA()
28.6.13 设置ThreadProc()函数的返回值
28.6.14 删除栈帧及函数返回
28.7 小结
第四部分 API钩取
第29章 API钩取:逆向分析之“花”
29.1 钩取
29.2 API是什么
29.3 API钩取
29.3.1 正常调用API
29.3.2 钩取API调用
29.4 技术图表
29.4.1 方法对象(是什么)
29.4.2 位置(何处)
29.4.3 技术(如何)
29.4.4 API
第30章 记事本WriteFile().API钩取
30.1 技术图表—调试技术
30.2 关于调试器的说明
30.2.1 术语
30.2.2 调试器功能
30.2.3 调试器的工作原理
30.2.4 调试事件
30.3 调试技术流程
30.4 练习
30.5 工作原理
30.5.1 栈
30.5.2 执行流
30.5.3.“脱钩”&“钩子”
30.6 源代码分析
30.6.1 main()
30.6.2 DebugLoop()
30.6.3 EXIT_PROCESS_DEBUG_EVENT
30.6.4 CREATE_PROCESS_DEBUG_EVENT-OnCreateProcess-DebugEvent()
30.6.5 EXCEPTION_DEBUG_EVENT-OnException-DebugEvent()
第31章 关于调试器
31.1 OllyDbg
31.2 IDA.Pro
31.3 WinDbg
第32章 计算器显示中文数字
32.1 技术图表
32.2 选定目标API
32.3 IAT钩取工作原理
32.4 练习示例
32.5 源代码分析
32.5.1 DllMain()
32.5.2 MySetWindowTextW()
32.5.3 hook_iat()
32.6 调试被注入的DLL文件
32.6.1 DllMain()
32.6.2 hook_iat()
32.6.3 MySetWindowTextW()
32.7 小结
第33章 隐藏进程
33.1 技术图表
33.2 API代码修改技术的原理
33.2.1 钩取之前
33.2.2 钩取之后
33.3 进程隐藏
33.3.1 进程隐藏工作原理
33.3.2 相关API
33.3.3 隐藏技术的问题
33.4 练习.#1(HideProc.exe,stealth.dll)
33.4.1 运行notepad.exe、procexp.exe、taskmgr.exe
33.4.2 运行HideProc.exe
33.4.3 确认stealth.dll注入成功
33.4.4 查看notepad.exe进程是否隐藏成功
33.4.5 取消notepad.exe进程隐藏
33.5 源代码分析
33.5.1 HideProc.cpp
33.5.2 stealth.cpp
33.6 全局API钩取
33.6.1 Kernel32.CreateProcess().API
33.6.2 Ntdll.ZwResumeThread().API
33.7 练习#2(HideProc2.exe,Stealth2.dll)
33.7.1 复制stealth2.dll文件到%SYSTEM%文件夹中
33.7.2 运行HideProc2.exe.-hide
33.7.3 运行ProcExp.exe?epad.exe
33.7.4 运行HideProc2.exe.-show
33.8 源代码分析
33.8.1 HideProc2.cpp
33.8.2 stealth2.cpp
33.9 利用“热补丁”技术钩取API
33.9.1 API代码修改技术的问题
33.9.2.“热补丁”(修改7个字节代码)
33.10 练习.#3:stealth3.dll
33.11 源代码分析
33.12 使用“热补丁”API钩取技术时需要考虑的问题
33.13 小结
第34章 高级全局API钩取:IE连接控制
34.1 目标API
34.2 IE进程结构
34.3 关于全局API钩取的概念
34.3.1 常规API钩取
34.3.2 全局API钩取
34.4 ntdll!ZwResumeThread().API
34.5 练习示例:控制IE网络连接
34.5.1 运行IE
34.5.2 注入DLL
34.5.3 创建新选项卡
34.5.4 尝试连接网站
34.5.5 卸载DLL
34.5.6 课外练习
34.6 示例源代码
34.6.1 DllMain()
34.6.2 NewInternetConnectW()
34.6.3 NewZwResumeThread()
34.7 小结
第35章 优秀分析工具的五种标准
35.1 工具
35.2 代码逆向分析工程师
35.3 优秀分析工具的五种标准
35.3.1 精简工具数量
35.3.2 工具功能简单、使用方便
35.3.3 完全掌握各种功能
35.3.4 不断升级更新
35.3.5 理解工具的核心工作原理
35.4 熟练程度的重要性
第五部分 64位&Windows内核
第36章 64位计算
36.1 64位计算环境
36.1.1 64位CPU
36.1.2 64位OS
36.1.3 Win32.API
36.1.4 WOW64
36.1.5 练习:WOW64Test
36.2 编译64位文件
36.2.1 Microsoft.Windows.SDK(Software.Development.Kit)
36.2.2 设置Visual.C++.2010.Express环境
第37章 x64处理器
37.1 x64中新增或变更的项目
37.1.1 64位
37.1.2 内存
37.1.3 通用寄存器
37.1.4 CALL/JMP指令
37.1.5 函数调用约定
37.1.6 栈.&.栈帧
37.2 练习:Stack32.exe.&.Stack64.exe
37.2.1 Stack32.exe
37.2.2 Stack64.exe
37.3 小结
第38章 PE32+
38.1 PE32+(PE+、PE64)
38.1.1 IMAGE_NT_HEADERS
38.1.2 IMAGE_FILE_HEADER
38.1.3 IMAGE_OPTIONAL_HEADER
38.1.4 IMAGE_THUNK_DATA
38.1.5 IMAGE_TLS_DIRECTORY
第39章 WinDbg
39.1 WinDbg
39.1.1 WinDbg的特征
39.1.2 运行WinDbg
39.1.3 内核调试
39.1.4 WinDbg基本指令
第40章 64位调试
40.1 x64环境下的调试器
40.2 64位调试
40.3 PE32:WOW64Test_x86.exe
40.3.1 EP代码
40.3.2 Startup代码
40.3.3 main()函数
40.4 PE32+:WOW64Test_x64.exe
40.4.1 系统断点
40.4.2 EP代码
40.4.3 Startup代码
40.4.4 main()函数
40.5 小结
第41章 ASLR
41.1 Windows内核版本
41.2 ASLR
41.3 Visual.C++
41.4 ASLR.exe
41.4.1 节区信息
41.4.2 IMAGE_FILE_HEADERCharacteristics
41.4.3 IMAGE_OPTIONAL_HEADERDLL.Characteristics
41.5 练习:删除ASLR功能
第42章 内核6中的会话
42.1 会话
42.2 会话0隔离机制
42.3 增强安全性
第43章 内核6中的DLL注入
43.1 再现DLL注入失败
43.1.1 源代码
43.1.2 注入测试
43.2 原因分析
43.2.1 调试.#1
43.2.2 调试.#2
43.3 练习:使CreateRemoteThread()正常工作
43.3.1 方法.#1:修改CreateSuspended参数值
43.3.2 方法.#2:操纵条件分支
43.4 稍作整理
43.5 InjectDll_new.exe
43.5.1 InjectDll_new.cpp
43.5.2 注入练习
第44章 InjDll.exe:DLL注入专用工具
44.1 InjDll.exe
44.1.1 使用方法
44.1.2 使用示例
44.1.3 注意事项
第六部分 高级逆向分析技术
第45章 TLS回调函数
45.1 练习.#1:HelloTls.exe
45.2 TLS
45.2.1 IMAGE_DATA_DIRECTORY[9]
45.2.2 IMAGE_TLS_DIRECTORY
45.2.3 回调函数地址数组
45.3 TLS回调函数
45.4 练习.#2:TlsTest.exe
45.4.1 DLL_PROCESS_ATTACH
45.4.2 DLL_THREAD_ATTACH
45.4.3 DLL_THREAD_DETACH
45.4.4 DLL_PROCESS_DETACH
45.5 调试TLS回调函数
45.6 手工添加TLS回调函数
45.6.1 修改前的原程序
45.6.2 设计规划
45.6.3 编辑PE文件头
45.6.4 设置IMAGE_TLS_DIRECTORY结构体
45.6.5 编写TLS回调函数
45.6.6 最终完成
45.7 小结
第46章 TEB
46.1 TEB
46.1.1 TEB结构体的定义
46.1.2 TEB结构体成员
46.1.3 重要成员
46.2 TEB访问方法
46.2.1 Ntdll.NtCurrentTeb()
46.2.2 FS段寄存器
46.3 小结
第47章 PEB
47.1 PEB
47.1.1 PEB访问方法
47.1.2 PEB结构体的定义
47.1.3 PEB结构体的成员
47.2 PEB的重要成员
47.2.1 PEB.BeingDebugged
47.2.2 PEB.ImageBaseAddress
47.2.3 PEB.Ldr
47.2.4 PEB.ProcessHeap.&.PEB.NtGlobalFlag
47.3 小结
第48章 SEH
48.1 SEH
48.2 SEH练习示例.#1
48.2.1 正常运行
48.2.2 调试运行
48.3 OS的异常处理方法
48.3.1 正常运行时的异常处理方法
48.3.2 调试运行时的异常处理方法
48.4 异常
48.4.1 EXCEPTION_ACCESS_VIOLATION(C0000005)
48.4.2 EXCEPTION_BREAKPOINT(80000003)
48.4.3 EXCEPTION_ILLEGAL_INSTRUCTION(C000001D)
48.4.4 EXCEPTION_INT_DIVIDE_BY_ZERO(C0000094)
48.4.5 EXCEPTION_SINGLE_STEP(80000004)
48.5 SEH详细说明
48.5.1 SEH链
48.5.2 异常处理函数的定义
48.5.3 TEB.NtTib.ExceptionList
48.5.4 SEH安装方法
48.6 SEH练习示例.#2(seh.exe)
48.6.1 查看SEH链
48.6.2 添加SEH
48.6.3 发生异常
48.6.4 查看异常处理器参数
48.6.5 调试异常处理器
48.6.6 删除SEH
48.7 设置OllyDbg选项
48.7.1 忽略KERNEL32中发生的内存非法访问异常
48.7.2 向被调试者派送异常
48.7.3 其他异常处理
48.7.4 简单练习
48.8 小结
第49章 IA-32指令
49.1 IA-32指令
49.2 常用术语
49.2.1 反汇编器
49.2.2 反编译器
49.2.3 反编译简介
49.3 IA-32指令格式
49.3.1 指令前缀
49.3.2 操作码
49.3.3 ModR/M
49.3.4 SIB
49.3.5 位移
49.3.6 立即数
49.4 指令解析手册
49.4.1 下载IA-32用户手册
49.4.2 打印指令解析手册
49.5 指令解析练习
49.5.1 操作码映射
49.5.2 操作数
49.5.3 ModR/M
49.5.4 Group
49.5.5 前缀
49.5.6 双字节操作码
49.5.7 移位值&立即数
49.5.8 SIB
49.6 指令解析课外练习
49.7 小结
第七部分 反调试技术
第50章 反调试技术
50.1 反调试技术
50.1.1 依赖性
50.1.2 多种反调试技术
50.2 反调试破解技术
50.3 反调试技术的分类
50.3.1 静态反调试技术
50.3.2 动态反调试技术
第51章 静态反调试技术
51.1 静态反调试的目的
51.2 PEB
51.2.1 BeingDebugged(+0x2)
51.2.2 Ldr(+0xC)
51.2.3 Process.Heap(+0x18)
51.2.4 NtGlobalFlag(+0x68)
51.2.5 练习:?StaAD_PEB.exe
51.2.6 破解之法
51.3 NtQueryInformationProcess()
51.3.1 ProcessDebugPort(0x7)
51.3.2 ProcessDebugObjectHandle(0x1E)
51.3.3 ProcessDebugFlags(0x1F)
51.3.4 练习:StaAD_NtQIP.exe
51.3.5 破解之法
51.4 NtQuerySystemInformation()
51.4.1 SystemKernelDebugger-Information(0x23)
51.4.2 练习:StaAD_NtQSI.exe
51.4.3 破解之法
51.5 NtQueryObject()
51.6 ZwSetInformationThread()
51.6.1 练习:StaAD_ZwSIT.exe
51.6.2 破解之法
51.7 TLS回调函数
51.8 ETC
51.8.1 练习:StaAD_FindWindow.exe
51.8.2 破解之法
51.9 小结
第52章 动态反调试技术
52.1 动态反调试技术的目的
52.2 异常
52.2.1 SEH
52.2.2 SetUnhandledException-Filter()
52.3 Timing.Check
52.3.1 时间间隔测量法
52.3.2 RDTSC
52.4 陷阱标志
52.4.1 单步执行
52.4.2 INT.2D
52.5 0xCC探测
52.5.1 API断点
52.5.2 比较校验和
第53章 高级反调试技术
53.1 高级反调试技术
53.2 垃圾代码
53.3 扰乱代码对齐
53.4 加密/解密
53.4.1 简单的解码示例
53.4.2 复杂的解码示例
53.4.3 特殊情况:代码重组
53.5 Stolen.Bytes(Remove.OEP)
53.6 API重定向
53.6.1 原代码
53.6.2 API重定向示例.#1
53.6.3 API重定向示例#2
53.7 Debug.Blocker(Self.Debugging)
53.8 小结
第八部分 调试练习
第54章 调试练习1:服务
54.1 服务进程的工作原理
54.1.1 服务控制器
54.1.2 服务启动过程
54.2 DebugMe1.exe示例讲解
54.2.1 安装服务
54.2.2 启动服务
54.2.3 源代码
54.3 服务进程的调试
54.3.1 问题在于SCM
54.3.2 调试器无所不能
54.3.3 常用方法
54.4 服务调试练习
54.4.1 直接调试:强制设置EIP
54.4.2 服务调试的常用方法:“附加”方式
54.5 小结
第55章 调试练习2:自我创建
55.1 自我创建
55.2 工作原理
55.2.1 创建子进程(挂起模式)
55.2.2 更改EIP
55.2.3 恢复主线程
55.3 示例程序源代码
55.4 调试练习
55.4.1 需要考虑的事项
55.4.2 JIT调试
55.4.3 DebugMe2.exe
55.5 小结
第56章 调试练习3:PE映像切换
56.1 PE映像
56.2 PE映像切换
56.3 示例程序:Fake.exe、Real.exe、DebugMe3.exe
56.4 调试1
56.4.1 Open?.输入运行参数
56.4.2 main()函数
56.4.3 SubFunc_1()
56.4.4 CreateProcess(“fake.exe”,CREATE_SUSPENDED)
56.4.5 SubFunc_2()
56.4.6 SubFunc_3()
56.4.7 ResumeThread()
56.5 调试2
56.5.1 思考
56.5.2 向EP设置无限循环
56.6 小结
第57章 调试练习4:Debug.Blocker
57.1 Debug.Blocker
57.2 反调试特征
57.2.1 父与子的关系
57.2.2 被调试进程不能再被其他调试器调试
57.2.3 终止调试进程的同时也终止被调试进程
57.2.4 调试器操作被调试者的代码
57.2.5 调试器处理被调试进程中发生的异常
57.3 调试练习:DebugMe4.exe
57.4 第一次调试
57.4.1 选定调试的起始位置
57.4.2 main()
57.5 第二次调试
57.6 第三次调试
57.7 第四次调试
57.8 第五次调试
57.8.1 系统断点
57.8.2 EXCEPTION_ILLEGAL_INSTRUCTION(1)
57.8.3 EXCEPTION_ILLEGAL_INSTRUCTION(2)
57.9 第六次调试
57.9.1 40121D(第一个异常)
57.9.2 401299(第二个异常)
57.10 第七次调试
57.10.1 静态方法
57.10.2 动态方法
57.11 小结
结束语
索引
第1章 关于逆向工程
1.1 逆向工程
1.2 代码逆向工程
1.2.1 逆向分析法
1.2.2 源代码、十六进制代码、汇编代码
1.2.3.“打补丁”与“破解”
1.3 代码逆向准备
1.3.1 目标
1.3.2 激情
1.3.3 谷歌
1.4 学习逆向分析技术的禁忌
1.4.1 贪心
1.4.2 急躁
1.5 逆向分析技术的乐趣
第2章 逆向分析Hello.World!程序
2.1 Hello.World!程序
2.2 调试HelloWorld.exe程序
2.2.1 调试目标
2.2.2 开始调试
2.2.3 入口点
2.2.4 跟踪40270C函数
2.2.5 跟踪40104F跳转语句
2.2.6 查找main()函数
2.3 进一步熟悉调试器
2.3.1 调试器指令
2.3.2.“大本营”
2.3.3 设置“大本营”的四种方法
2.4 快速查找指定代码的四种方法
2.4.1 代码执行法
2.4.2 字符串检索法
2.4.3 API检索法(1):在调用代码中设置断点
2.4.4 API检索法(2):在API代码中设置断点
2.5 使用“打补丁”方式修改“Hello.World!”字符串
2.5.1.“打补丁”
2.5.2 修改字符串的两种方法
2.6 小结
第3章 小端序标记法
3.1 字节序
3.1.1 大端序与小端序
3.1.2 在OllyDbg中查看小端序
第4章 IA-32寄存器基本讲解
4.1 什么是CPU寄存器
4.2 IA-32寄存器
4.3 小结
第5章 栈
5.1 栈
5.1.1 栈的特征
5.1.2 栈操作示例
第6章 分析abex’.crackme#1
6.1 abex’.crackme.#1
6.1.1 开始调试
6.1.2 分析代码
6.2 破解
6.3 将参数压入栈
6.4 小结
第7章 栈帧
7.1 栈帧
7.2 调试示例:stackframe.exe
7.2.1 StackFrame.cpp
7.2.2 开始执行main()函数&生成栈帧
7.2.3 设置局部变量
7.2.4 add()函数参数传递与调用
7.2.5 开始执行add()函数&生成栈帧
7.2.6 设置add()函数的局部变量(x,.y)
7.2.7 ADD运算
7.2.8 删除函数add()的栈帧&函数执行完毕(返回)
7.2.9 从栈中删除函数add()的参数(整理栈)
7.2.10 调用printf()函数
7.2.11 设置返回值
7.2.12 删除栈帧&main()函数终止
7.3 设置OllyDbg选项
7.3.1 Disasm选项
7.3.2 Analysis1选项
7.4 小结
第8章 abex’.crackme.#2
8.1 运行abex’.crackme.#2
8.2 Visual.Basic文件的特征
8.2.1 VB专用引擎
8.2.2 本地代码和伪代码
8.2.3 事件处理程序
8.2.4 未文档化的结构体
8.3 开始调试
8.3.1 间接调用
8.3.2 RT_MainStruct结构体
8.3.3 ThunRTMain()函数
8.4 分析crackme
8.4.1 检索字符串
8.4.2 查找字符串地址
8.4.3 生成Serial的算法
8.4.4 预测代码
8.4.5 读取Name字符串的代码
8.4.6 加密循环
8.4.7 加密方法
8.5 小结
第9章 Process.Explorer——最优秀的进程管理工具
9.1 Process.Explorer
9.2 具体有哪些优点呢
9.3 sysinternals
第10章 函数调用约定
10.1 函数调用约定
10.1.1 cdecl
10.1.2 stdcall
10.1.3 fastcall
第11章 视频讲座
11.1 运行
11.2 分析
11.2.1 目标(1):去除消息框
11.2.2 打补丁(1):去除消息框
11.2.3 目标(2):查找注册码
11.3 小结
第12章 究竟应当如何学习代码逆向分析
12.1 逆向工程
12.1.1 任何学习都应当有目标
12.1.2 拥有积极心态
12.1.3 要感受其中的乐趣
12.1.4 让检索成为日常生活的一部分
12.1.5 最重要的是实践
12.1.6 请保持平和的心态
第二部分 PE文件格式
第13章 PE文件格式
13.1 介绍
13.2 PE文件格式
13.2.1 基本结构
13.2.2 VA&RVA
13.3 PE头
13.3.1 DOS头
13.3.2 DOS存根
13.3.3 NT头
13.3.4 NT头:文件头
13.3.5 NT头:可选头
13.3.6 节区头
13.4 RVA.to.RAW
13.5 IAT
13.5.1 DLL
13.5.2 IMAGE_IMPORT_DESCRIPTOR
13.5.3 使用notepad.exe练习
13.6 EAT
13.6.1 IMAGE_EXPORT_DIRECTORY
13.6.2 使用kernel32.dll练习
13.7 高级PE
13.7.1 PEView.exe
13.7.2 Patched.PE
13.8 小结
第14章 运行时压缩
14.1 数据压缩
14.1.1 无损压缩
14.1.2 有损压缩
14.2 运行时压缩器
14.2.1 压缩器
14.2.2 保护器
14.3 运行时压缩测试
第15章 调试UPX压缩的notepad程序
15.1 notepad.exe的EP代码
15.2 notepad_upx.exe的EP代码
15.3 跟踪UPX文件
15.3.1 OllyDbg的跟踪命令
15.3.2 循环.#1
15.3.3 循环.#2
15.3.4 循环.#3
15.3.5 循环.#4
15.4 快速查找UPX.OEP的方法
15.4.1 在POPAD指令后的JMP指令处设置断点
15.4.2 在栈中设置硬件断点
15.5 小结
第16章 基址重定位表
16.1 PE重定位
16.1.1 DLL/SYS
16.1.2 EXE
16.2 PE重定位时执行的操作
16.3 PE重定位操作原理
16.3.1 基址重定位表
16.3.2 IMAGE_BASE_RELOCATION结构体
16.3.3 基址重定位表的分析方法
16.3.4 练习
第17章 从可执行文件中删除.reloc节区
17.1 .reloc节区
17.2 reloc.exe
17.2.1 删除.reloc节区头
17.2.2 删除.reloc节区
17.2.3 修改IMAGE_FILE_HEADER
17.2.4 修改IMAGE_OPTIONAL_HEADER
17.3 小结
第18章 UPack.PE文件头详细分析
18.1 UPack说明
18.2 使用UPack压缩notepad.exe
18.3 使用Stud_PE工具
18.4 比较PE文件头
18.4.1 原notepad.exe的PE文件头
18.4.2 notepad_upack.exe运行时压缩的PE文件头
18.5 分析UPack的PE文件头
18.5.1 重叠文件头
18.5.2 IMAGE_FILE_HEADER.SizeOfOptionalHeader
18.5.3 IMAGE_OPTIONAL_HEADER.NumberOf-RvaAndSizes
18.5.4 IMAGE_SECTION_HEADER
18.5.5 重叠节区
18.5.6 RVA.to.RAW
18.5.7 导入表(IMAGE_IMPORT_DESCRIPTOR.array)
18.5.8 导入地址表
18.6 小结
第19章 UPack调试?.查找OEP
19.1 OllyDbg运行错误
19.2 解码循环
19.3 设置IAT
19.4 小结
第20章 “内嵌补丁”练习
20.1 内嵌补丁
20.2 练习:Patchme
20.3 调试:查看代码流
20.4 代码结构
20.5.“内嵌补丁”练习
20.5.1 补丁代码要设置在何处呢
20.5.2 制作补丁代码
20.5.3 执行补丁代码
20.5.4 结果确认
第三部分 DLL注入
第21章 Windows消息钩取
21.1 钩子
21.2 消息钩子
21.3 SetWindowsHookEx()
21.4 键盘消息钩取练习
21.4.1 练习示例HookMain.exe
21.4.2 分析源代码
21.5 调试练习
21.5.1 调试HookMain.exe
21.5.2 调试Notepad.exe进程内的KeyHook.dll
21.6 小结
第22章 恶意键盘记录器
22.1 恶意键盘记录器的目标
22.1.1 在线游戏
22.1.2 网上银行
22.1.3 商业机密泄露
22.2 键盘记录器的种类与发展趋势
22.3 防范恶意键盘记录器
22.4 个人信息
第23章 DLL注入
23.1 DLL注入
23.2 DLL注入示例
23.2.1 改善功能与修复Bug
23.2.2 消息钩取
23.2.3 API钩取
23.2.4 其他应用程序
23.2.5 恶意代码
23.3 DLL注入的实现方法
23.4 CreateRemoteThread()
23.4.1 练习示例myhack.dll
23.4.2 分析示例源代码
23.4.3 调试方法
23.5 AppInit_DLLs
23.5.1 分析示例源码
23.5.2 练习示例myhack2.dll
23.6 SetWindowsHookEx()
23.7 小结
第24章 DLL卸载
24.1 DLL卸载的工作原理
24.2 实现DLL卸载
24.2.1 获取进程中加载的DLL信息
24.2.2 获取目标进程的句柄
24.2.3 获取FreeLibrary().API地址
24.2.4 在目标进程中运行线程
24.3 DLL卸载练习
24.3.1 复制文件及运行notepad.exe
24.3.2 注入myhack.dll
24.3.3 卸载myhack.dll
第25章 通过修改PE加载DLL
25.1 练习文件
25.1.1 TextView.exe
25.1.2 TextView_patched.exe
25.2 源代码.-.myhack3.cpp
25.2.1 DllMain()
25.2.2 DownloadURL()
25.2.3 DropFile()
25.2.4 dummy()
25.3 修改TextView.exe文件的准备工作
25.3.1 修改思路
25.3.2 查看IDT是否有足够空间
25.3.3 移动IDT
25.4 修改TextView.exe
25.4.1 修改导入表的RVA值
25.4.2 删除绑定导入表
25.4.3 创建新IDT
25.4.4 设置Name、INT、IAT
25.4.5 修改IAT节区的属性值
25.5 检测验证
25.6 小结
第26章 PE.Tools
26.1 PE.Tools
26.1.1 进程内存转储
26.1.2 PE编辑器
26.2 小结
第27章 代码注入
27.1 代码注入
27.2 DLL注入与代码注入
27.3 练习示例
27.3.1 运行notepad.exe
27.3.2 运行CodeInjection.exe
27.3.3 弹出消息框
27.4 CodeInjection.cpp
27.4.1 main()函数
27.4.2 ThreadProc()函数
27.4.3 InjectCode()函数
27.5 代码注入调试练习
27.5.1 调试notepad.exe
27.5.2 设置OllyDbg选项
27.5.3 运行CodeInjection.exe
27.5.4 线程开始代码
27.6 小结
第28章 使用汇编语言编写注入代码
28.1 目标
28.2 汇编编程
28.3 OllyDbg的汇编命令
28.3.1 编写ThreadProc()函数
28.3.2 保存文件
28.4 编写代码注入程序
28.4.1 获取ThreadProc()函数的二进制代码
28.4.2 CodeInjection2.cpp
28.5 调试练习
28.5.1 调试notepad.exe
28.5.2 设置OllyDbg选项
28.5.3 运行CodeInjection2.exe
28.5.4 线程起始代码
28.6 详细分析
28.6.1 生成栈帧
28.6.2 THREAD_PARAM结构体指针
28.6.3.“User32.dll”字符串
28.6.4 压入“user32.dll”字符串参数
28.6.5 调用LoadLibraryA(“user32.dll”)
28.6.6.“MessageBoxA”字符串
28.6.7 调用GetProcAddress(hMod,“MessageBoxA”)
28.6.8 压入MessageBoxA()函数的参数.1.-MB_OK
28.6.9 压入MessageBoxA()函数的参数.2.-“ReverseCore”
28.6.10 压入MessageBoxA()函数的参数.3.-“www.reversecore.com”
28.6.11 压入MessageBoxA()函数的参数.4.-NULL
28.6.12 调用MessageBoxA()
28.6.13 设置ThreadProc()函数的返回值
28.6.14 删除栈帧及函数返回
28.7 小结
第四部分 API钩取
第29章 API钩取:逆向分析之“花”
29.1 钩取
29.2 API是什么
29.3 API钩取
29.3.1 正常调用API
29.3.2 钩取API调用
29.4 技术图表
29.4.1 方法对象(是什么)
29.4.2 位置(何处)
29.4.3 技术(如何)
29.4.4 API
第30章 记事本WriteFile().API钩取
30.1 技术图表—调试技术
30.2 关于调试器的说明
30.2.1 术语
30.2.2 调试器功能
30.2.3 调试器的工作原理
30.2.4 调试事件
30.3 调试技术流程
30.4 练习
30.5 工作原理
30.5.1 栈
30.5.2 执行流
30.5.3.“脱钩”&“钩子”
30.6 源代码分析
30.6.1 main()
30.6.2 DebugLoop()
30.6.3 EXIT_PROCESS_DEBUG_EVENT
30.6.4 CREATE_PROCESS_DEBUG_EVENT-OnCreateProcess-DebugEvent()
30.6.5 EXCEPTION_DEBUG_EVENT-OnException-DebugEvent()
第31章 关于调试器
31.1 OllyDbg
31.2 IDA.Pro
31.3 WinDbg
第32章 计算器显示中文数字
32.1 技术图表
32.2 选定目标API
32.3 IAT钩取工作原理
32.4 练习示例
32.5 源代码分析
32.5.1 DllMain()
32.5.2 MySetWindowTextW()
32.5.3 hook_iat()
32.6 调试被注入的DLL文件
32.6.1 DllMain()
32.6.2 hook_iat()
32.6.3 MySetWindowTextW()
32.7 小结
第33章 隐藏进程
33.1 技术图表
33.2 API代码修改技术的原理
33.2.1 钩取之前
33.2.2 钩取之后
33.3 进程隐藏
33.3.1 进程隐藏工作原理
33.3.2 相关API
33.3.3 隐藏技术的问题
33.4 练习.#1(HideProc.exe,stealth.dll)
33.4.1 运行notepad.exe、procexp.exe、taskmgr.exe
33.4.2 运行HideProc.exe
33.4.3 确认stealth.dll注入成功
33.4.4 查看notepad.exe进程是否隐藏成功
33.4.5 取消notepad.exe进程隐藏
33.5 源代码分析
33.5.1 HideProc.cpp
33.5.2 stealth.cpp
33.6 全局API钩取
33.6.1 Kernel32.CreateProcess().API
33.6.2 Ntdll.ZwResumeThread().API
33.7 练习#2(HideProc2.exe,Stealth2.dll)
33.7.1 复制stealth2.dll文件到%SYSTEM%文件夹中
33.7.2 运行HideProc2.exe.-hide
33.7.3 运行ProcExp.exe?epad.exe
33.7.4 运行HideProc2.exe.-show
33.8 源代码分析
33.8.1 HideProc2.cpp
33.8.2 stealth2.cpp
33.9 利用“热补丁”技术钩取API
33.9.1 API代码修改技术的问题
33.9.2.“热补丁”(修改7个字节代码)
33.10 练习.#3:stealth3.dll
33.11 源代码分析
33.12 使用“热补丁”API钩取技术时需要考虑的问题
33.13 小结
第34章 高级全局API钩取:IE连接控制
34.1 目标API
34.2 IE进程结构
34.3 关于全局API钩取的概念
34.3.1 常规API钩取
34.3.2 全局API钩取
34.4 ntdll!ZwResumeThread().API
34.5 练习示例:控制IE网络连接
34.5.1 运行IE
34.5.2 注入DLL
34.5.3 创建新选项卡
34.5.4 尝试连接网站
34.5.5 卸载DLL
34.5.6 课外练习
34.6 示例源代码
34.6.1 DllMain()
34.6.2 NewInternetConnectW()
34.6.3 NewZwResumeThread()
34.7 小结
第35章 优秀分析工具的五种标准
35.1 工具
35.2 代码逆向分析工程师
35.3 优秀分析工具的五种标准
35.3.1 精简工具数量
35.3.2 工具功能简单、使用方便
35.3.3 完全掌握各种功能
35.3.4 不断升级更新
35.3.5 理解工具的核心工作原理
35.4 熟练程度的重要性
第五部分 64位&Windows内核
第36章 64位计算
36.1 64位计算环境
36.1.1 64位CPU
36.1.2 64位OS
36.1.3 Win32.API
36.1.4 WOW64
36.1.5 练习:WOW64Test
36.2 编译64位文件
36.2.1 Microsoft.Windows.SDK(Software.Development.Kit)
36.2.2 设置Visual.C++.2010.Express环境
第37章 x64处理器
37.1 x64中新增或变更的项目
37.1.1 64位
37.1.2 内存
37.1.3 通用寄存器
37.1.4 CALL/JMP指令
37.1.5 函数调用约定
37.1.6 栈.&.栈帧
37.2 练习:Stack32.exe.&.Stack64.exe
37.2.1 Stack32.exe
37.2.2 Stack64.exe
37.3 小结
第38章 PE32+
38.1 PE32+(PE+、PE64)
38.1.1 IMAGE_NT_HEADERS
38.1.2 IMAGE_FILE_HEADER
38.1.3 IMAGE_OPTIONAL_HEADER
38.1.4 IMAGE_THUNK_DATA
38.1.5 IMAGE_TLS_DIRECTORY
第39章 WinDbg
39.1 WinDbg
39.1.1 WinDbg的特征
39.1.2 运行WinDbg
39.1.3 内核调试
39.1.4 WinDbg基本指令
第40章 64位调试
40.1 x64环境下的调试器
40.2 64位调试
40.3 PE32:WOW64Test_x86.exe
40.3.1 EP代码
40.3.2 Startup代码
40.3.3 main()函数
40.4 PE32+:WOW64Test_x64.exe
40.4.1 系统断点
40.4.2 EP代码
40.4.3 Startup代码
40.4.4 main()函数
40.5 小结
第41章 ASLR
41.1 Windows内核版本
41.2 ASLR
41.3 Visual.C++
41.4 ASLR.exe
41.4.1 节区信息
41.4.2 IMAGE_FILE_HEADERCharacteristics
41.4.3 IMAGE_OPTIONAL_HEADERDLL.Characteristics
41.5 练习:删除ASLR功能
第42章 内核6中的会话
42.1 会话
42.2 会话0隔离机制
42.3 增强安全性
第43章 内核6中的DLL注入
43.1 再现DLL注入失败
43.1.1 源代码
43.1.2 注入测试
43.2 原因分析
43.2.1 调试.#1
43.2.2 调试.#2
43.3 练习:使CreateRemoteThread()正常工作
43.3.1 方法.#1:修改CreateSuspended参数值
43.3.2 方法.#2:操纵条件分支
43.4 稍作整理
43.5 InjectDll_new.exe
43.5.1 InjectDll_new.cpp
43.5.2 注入练习
第44章 InjDll.exe:DLL注入专用工具
44.1 InjDll.exe
44.1.1 使用方法
44.1.2 使用示例
44.1.3 注意事项
第六部分 高级逆向分析技术
第45章 TLS回调函数
45.1 练习.#1:HelloTls.exe
45.2 TLS
45.2.1 IMAGE_DATA_DIRECTORY[9]
45.2.2 IMAGE_TLS_DIRECTORY
45.2.3 回调函数地址数组
45.3 TLS回调函数
45.4 练习.#2:TlsTest.exe
45.4.1 DLL_PROCESS_ATTACH
45.4.2 DLL_THREAD_ATTACH
45.4.3 DLL_THREAD_DETACH
45.4.4 DLL_PROCESS_DETACH
45.5 调试TLS回调函数
45.6 手工添加TLS回调函数
45.6.1 修改前的原程序
45.6.2 设计规划
45.6.3 编辑PE文件头
45.6.4 设置IMAGE_TLS_DIRECTORY结构体
45.6.5 编写TLS回调函数
45.6.6 最终完成
45.7 小结
第46章 TEB
46.1 TEB
46.1.1 TEB结构体的定义
46.1.2 TEB结构体成员
46.1.3 重要成员
46.2 TEB访问方法
46.2.1 Ntdll.NtCurrentTeb()
46.2.2 FS段寄存器
46.3 小结
第47章 PEB
47.1 PEB
47.1.1 PEB访问方法
47.1.2 PEB结构体的定义
47.1.3 PEB结构体的成员
47.2 PEB的重要成员
47.2.1 PEB.BeingDebugged
47.2.2 PEB.ImageBaseAddress
47.2.3 PEB.Ldr
47.2.4 PEB.ProcessHeap.&.PEB.NtGlobalFlag
47.3 小结
第48章 SEH
48.1 SEH
48.2 SEH练习示例.#1
48.2.1 正常运行
48.2.2 调试运行
48.3 OS的异常处理方法
48.3.1 正常运行时的异常处理方法
48.3.2 调试运行时的异常处理方法
48.4 异常
48.4.1 EXCEPTION_ACCESS_VIOLATION(C0000005)
48.4.2 EXCEPTION_BREAKPOINT(80000003)
48.4.3 EXCEPTION_ILLEGAL_INSTRUCTION(C000001D)
48.4.4 EXCEPTION_INT_DIVIDE_BY_ZERO(C0000094)
48.4.5 EXCEPTION_SINGLE_STEP(80000004)
48.5 SEH详细说明
48.5.1 SEH链
48.5.2 异常处理函数的定义
48.5.3 TEB.NtTib.ExceptionList
48.5.4 SEH安装方法
48.6 SEH练习示例.#2(seh.exe)
48.6.1 查看SEH链
48.6.2 添加SEH
48.6.3 发生异常
48.6.4 查看异常处理器参数
48.6.5 调试异常处理器
48.6.6 删除SEH
48.7 设置OllyDbg选项
48.7.1 忽略KERNEL32中发生的内存非法访问异常
48.7.2 向被调试者派送异常
48.7.3 其他异常处理
48.7.4 简单练习
48.8 小结
第49章 IA-32指令
49.1 IA-32指令
49.2 常用术语
49.2.1 反汇编器
49.2.2 反编译器
49.2.3 反编译简介
49.3 IA-32指令格式
49.3.1 指令前缀
49.3.2 操作码
49.3.3 ModR/M
49.3.4 SIB
49.3.5 位移
49.3.6 立即数
49.4 指令解析手册
49.4.1 下载IA-32用户手册
49.4.2 打印指令解析手册
49.5 指令解析练习
49.5.1 操作码映射
49.5.2 操作数
49.5.3 ModR/M
49.5.4 Group
49.5.5 前缀
49.5.6 双字节操作码
49.5.7 移位值&立即数
49.5.8 SIB
49.6 指令解析课外练习
49.7 小结
第七部分 反调试技术
第50章 反调试技术
50.1 反调试技术
50.1.1 依赖性
50.1.2 多种反调试技术
50.2 反调试破解技术
50.3 反调试技术的分类
50.3.1 静态反调试技术
50.3.2 动态反调试技术
第51章 静态反调试技术
51.1 静态反调试的目的
51.2 PEB
51.2.1 BeingDebugged(+0x2)
51.2.2 Ldr(+0xC)
51.2.3 Process.Heap(+0x18)
51.2.4 NtGlobalFlag(+0x68)
51.2.5 练习:?StaAD_PEB.exe
51.2.6 破解之法
51.3 NtQueryInformationProcess()
51.3.1 ProcessDebugPort(0x7)
51.3.2 ProcessDebugObjectHandle(0x1E)
51.3.3 ProcessDebugFlags(0x1F)
51.3.4 练习:StaAD_NtQIP.exe
51.3.5 破解之法
51.4 NtQuerySystemInformation()
51.4.1 SystemKernelDebugger-Information(0x23)
51.4.2 练习:StaAD_NtQSI.exe
51.4.3 破解之法
51.5 NtQueryObject()
51.6 ZwSetInformationThread()
51.6.1 练习:StaAD_ZwSIT.exe
51.6.2 破解之法
51.7 TLS回调函数
51.8 ETC
51.8.1 练习:StaAD_FindWindow.exe
51.8.2 破解之法
51.9 小结
第52章 动态反调试技术
52.1 动态反调试技术的目的
52.2 异常
52.2.1 SEH
52.2.2 SetUnhandledException-Filter()
52.3 Timing.Check
52.3.1 时间间隔测量法
52.3.2 RDTSC
52.4 陷阱标志
52.4.1 单步执行
52.4.2 INT.2D
52.5 0xCC探测
52.5.1 API断点
52.5.2 比较校验和
第53章 高级反调试技术
53.1 高级反调试技术
53.2 垃圾代码
53.3 扰乱代码对齐
53.4 加密/解密
53.4.1 简单的解码示例
53.4.2 复杂的解码示例
53.4.3 特殊情况:代码重组
53.5 Stolen.Bytes(Remove.OEP)
53.6 API重定向
53.6.1 原代码
53.6.2 API重定向示例.#1
53.6.3 API重定向示例#2
53.7 Debug.Blocker(Self.Debugging)
53.8 小结
第八部分 调试练习
第54章 调试练习1:服务
54.1 服务进程的工作原理
54.1.1 服务控制器
54.1.2 服务启动过程
54.2 DebugMe1.exe示例讲解
54.2.1 安装服务
54.2.2 启动服务
54.2.3 源代码
54.3 服务进程的调试
54.3.1 问题在于SCM
54.3.2 调试器无所不能
54.3.3 常用方法
54.4 服务调试练习
54.4.1 直接调试:强制设置EIP
54.4.2 服务调试的常用方法:“附加”方式
54.5 小结
第55章 调试练习2:自我创建
55.1 自我创建
55.2 工作原理
55.2.1 创建子进程(挂起模式)
55.2.2 更改EIP
55.2.3 恢复主线程
55.3 示例程序源代码
55.4 调试练习
55.4.1 需要考虑的事项
55.4.2 JIT调试
55.4.3 DebugMe2.exe
55.5 小结
第56章 调试练习3:PE映像切换
56.1 PE映像
56.2 PE映像切换
56.3 示例程序:Fake.exe、Real.exe、DebugMe3.exe
56.4 调试1
56.4.1 Open?.输入运行参数
56.4.2 main()函数
56.4.3 SubFunc_1()
56.4.4 CreateProcess(“fake.exe”,CREATE_SUSPENDED)
56.4.5 SubFunc_2()
56.4.6 SubFunc_3()
56.4.7 ResumeThread()
56.5 调试2
56.5.1 思考
56.5.2 向EP设置无限循环
56.6 小结
第57章 调试练习4:Debug.Blocker
57.1 Debug.Blocker
57.2 反调试特征
57.2.1 父与子的关系
57.2.2 被调试进程不能再被其他调试器调试
57.2.3 终止调试进程的同时也终止被调试进程
57.2.4 调试器操作被调试者的代码
57.2.5 调试器处理被调试进程中发生的异常
57.3 调试练习:DebugMe4.exe
57.4 第一次调试
57.4.1 选定调试的起始位置
57.4.2 main()
57.5 第二次调试
57.6 第三次调试
57.7 第四次调试
57.8 第五次调试
57.8.1 系统断点
57.8.2 EXCEPTION_ILLEGAL_INSTRUCTION(1)
57.8.3 EXCEPTION_ILLEGAL_INSTRUCTION(2)
57.9 第六次调试
57.9.1 40121D(第一个异常)
57.9.2 401299(第二个异常)
57.10 第七次调试
57.10.1 静态方法
57.10.2 动态方法
57.11 小结
结束语
索引
书摘插画






评论
还没有评论。