《逆向工程核心原理》

《逆向工程核心原理》

基本信息

作者:
(韩)李承远   

译者:
武传海

丛书名:
图灵程序设计丛书

出版社:人民邮电出版社

ISBN:9787115350183

上架时间:2014-4-15

出版日期:2014
年5月

开本:16开

页码:679

版次:1-1

所属分类:计算机 > 软件工程及软件方法学
> 综合

更多关于》》》《逆向工程核心原理》

 

编辑推荐

   
韩国逆向分析领域龙头之作!逆向分析师必知核心原理大全!本书集中讲解逆向分析技术及其操作原理,不仅通过通俗易懂的语言介绍了每项技术,更通过丰富的示例使读者彻底掌握核心部分的原理。阅读此书不仅可以为逆向分析打下坚实基础,更能够获得恒久保值的技术精髓。

  想成为逆向工程研究员的读者或正在从事逆向开发工作的开发人员一定会通过本书获得很大帮助。同时,想成为安全领域专家的人也可从本书轻松起步。

  主要内容

   IA-32
寄存器

  调试

  追踪

  
PE File Format

  可执行压缩

  
Base Relocation Table

  内嵌补丁练习

  
Windows message hooking

  
DLL Injection

  
DLL Ejection

  
Code Injection

  
API hooking

  
stealth process

  
global API hooking

  
64bit Computing

  
ASLR

  
Session in Kernel 6

  
TEB

  
PEB

  
SEH

  
IA-32 Instruction

  反调试

 

内容简介

 
  书籍

   
计算机书籍

《逆向工程核心原理》十分详尽地介绍了代码逆向分析的核心原理。作者在ahnlab
研究所工作多年,书中不仅包括其以此经验为基础亲自编写的大量代码,还包含了逆向工程研究人员必须了解的各种技术和技巧。彻底理解并切实掌握逆向工程这门技术,就能在众多it
相关领域进行拓展运用,这本书就是通向逆向工程大门的捷径。

想成为逆向工程研究员的读者或正在从事逆向开发工作的开发人员一定会通过本书获得很大帮助。同时,想成为安全领域专家的人也可从本书轻松起步。

 

媒体评论

  向安全技术专家迈出第一步的必选书!

  最近,越来越多的人开始关心信息技术安全,但是相关领域的安全技术专家仍然十分匮乏。主要有两方面原因导致这种现象形成:一方面是因为必须做大量准备,努力学习;另一方面是因为市面上缺乏系统讲解这类内容的专业书籍。

  信息技术安全领域的图书很少有讲解恶意代码分析的,本书恰好填补了这一空白。无论是刚开始学习恶意代码分析的朋友,还是从事恶意代码分析的专家,都会为本书面世而激动。

  虽然读者阅读本书时需要具有基本的汇编语言知识,但是本书内容讲解非常细致,涵盖了从恶意代码分析基础知识到高级技术的全部内容,系统而有条理,语言简洁,通俗易懂,并在讲解中选配了恰当的示例程序,使内容更易理解。对于最近出现的恶意代码中的各种常用技术,本书都做了详细讲解,无论你是初学者还是分析专家,都能从中获益。

  信息安全技术涉及各领域,需要知识渊博、经验丰富的专家。本书将帮你轻松迈出成为安全技术专家的第一步。

  ——韩昌奎,ASEC中心主任

  如果此刻你手上正捧着这本书,说明你已经被代码逆向分析的魅力深深吸引了!

  对于刚开始学习代码逆向分析技术的人而言,需要学习的内容很多,这容易让人心生畏惧、止步不前。其实不需担心,本书在学习过程中给出了大量提示,各位借助这些提示可以更好地理解所讲的内容。

  本书比较重视代码逆向分析者的心态引导与培养,在内容讲解上也与其他书籍不同,并不是单纯的技巧罗列,而是深刻讲解了相关技术的深层含义、技术的工作原理以及内部实现结构,这也是本书的重点所在。同时配合丰富示例,让内容变得更具体形象、更易理解,作者的良苦用心可见一斑。

  你想成为代码逆向分析员吗?如果你感到困惑:“我是开发人员,难道也需要读它吗?”不妨试试,它将成为你最好的同伴。

  ——郑官真,CISCO高级研究员

 

 

目录

《逆向工程核心原理》

第一部分 代码逆向技术基础

第1章 关于逆向工程 2

1.1 逆向工程
2

1.2 代码逆向工程
2

1.2.1 逆向分析法
2

1.2.2 源代码、十六进制代码、汇编代码
4

1.2.3
“打补丁”与“破解” 5

1.3 代码逆向准备
5

1.3.1 目标
5

1.3.2 激情
6

1.3.3 谷歌
6

1.4 学习逆向分析技术的禁忌
6

1.4.1 贪心
6

1.4.2 急躁
7

1.5 逆向分析技术的乐趣
7

第2章 逆向分析hello world!程序 8

2.1 hello
world!程序 8

2.2 调试helloworld.exe程序
9

2.2.1 调试目标
9

2.2.2 开始调试
9

2.2.3 入口点
10

2.2.4 跟踪40270c函数
10

2.2.5 跟踪40104f跳转语句
12

2.2.6 查找main()函数
12

2.3 进一步熟悉调试器
14

2.3.1 调试器指令
14

2.3.2
“大本营” 15

2.3.3 设置“大本营”的四种方法
15

2.4 快速查找指定代码的四种方法
17

2.4.1 代码执行法
18

2.4.2 字符串检索法
19

2.4.3 api检索法(1):在调用代码中设置断点
20

2.4.4 api检索法(2):在api代码中设置断点
21

2.5 使用“打补丁”方式修改“hello
world!”字符串 23

2.5.1
“打补丁” 23

2.5.2 修改字符串的两种方法
24

2.6 小结 28

第3章 小端序标记法 31

3.1 字节序
31

3.1.1 大端序与小端序
32

3.1.2 在ollydbg中查看小端序
32

第4章 ia-32寄存器基本讲解 34

4.1 什么是cpu寄存器
34

4.2 ia-32寄存器
34

4.3 小结 40

第5章 栈 41

5.1 栈 41

5.1.1 栈的特征
41

5.1.2 栈操作示例
41

第6章 分析abex’ crackme#1 44

6.1 abex’
crackme #1 44

6.1.1 开始调试
45

6.1.2 分析代码
45

6.2 破解 47

6.3 将参数压入栈
47

6.4 小结 48

第7章 栈帧 49

7.1 栈帧 49

7.2 调试示例:stackframe.exe
49

7.2.1 stackframe.cpp
50

7.2.2 开始执行main()函数&生成栈帧
51

7.2.3 设置局部变量
52

7.2.4 add()函数参数传递与调用
53

7.2.5 开始执行add()函数&生成栈帧
54

7.2.6 设置add()函数的局部变量(x,
y) 55

7.2.7 add运算
55

7.2.8 删除函数add()的栈帧&函数执行完毕(返回)
56

7.2.9 从栈中删除函数add()的参数(整理栈)
57

7.2.10 调用printf()函数
58

7.2.11 设置返回值
58

7.2.12 删除栈帧&main()函数终止
58

7.3 设置ollydbg选项
59

7.3.1 disasm选项
59

7.3.2 analysis1选项
60

7.4 小结 61

第8章 abex’ crackme #2 62

8.1 运行abex’
crackme #2 62

8.2 visual
basic文件的特征 63

8.2.1 vb专用引擎
63

8.2.2 本地代码和伪代码
63

8.2.3 事件处理程序
63

8.2.4 未文档化的结构体
63

8.3 开始调试
63

8.3.1 间接调用
64

8.3.2 rt_mainstruct结构体
64

8.3.3 thunrtmain()函数
65

8.4 分析crackme
65

8.4.1 检索字符串
65

8.4.2 查找字符串地址
66

8.4.3 生成serial的算法
68

8.4.4 预测代码
69

8.4.5 读取name字符串的代码
69

8.4.6 加密循环
70

8.4.7 加密方法
70

8.5 小结 72

第9章 process explorer——
最优秀的进程管理工具 74

9.1 process
explorer 74

9.2 具体有哪些优点呢
75

9.3 sysinternals
75

第10章 函数调用约定 76

10.1 函数调用约定
76

10.1.1 cdecl
76

10.1.2 stdcall
77

10.1.3 fastcall
78

第11章 视频讲座 79

11.1 运行
79

11.2 分析
79

11.2.1 目标(1):去除消息框
79

11.2.2 打补丁(1):去除消息框
81

11.2.3 目标(2):查找注册码
83

11.3 小结
85

第12章 究竟应当如何学习代码逆向分析 86

12.1 逆向工程
86

12.1.1 任何学习都应当有目标
86

12.1.2 拥有积极心态
86

12.1.3 要感受其中的乐趣
86

12.1.4 让检索成为日常生活的一部分
87

12.1.5 最重要的是实践
87

12.1.6 请保持平和的心态
87

第二部分 pe文件格式

第13章 pe文件格式 90

13.1 介绍
90

13.2 pe文件格式
90

13.2.1 基本结构
91

13.2.2 va&rva
92

13.3 pe头
92

13.3.1 dos头
93

13.3.2 dos存根
94

13.3.3 nt头
94

13.3.4 nt头:文件头
95

13.3.5 nt头:可选头
97

13.3.6 节区头
101

13.4 rva
to raw 104

13.5 iat
105

13.5.1 dll
105

13.5.2 image_import_descriptor
107

13.5.3 使用notepad.exe练习
108

13.6 eat
112

13.6.1 image_export_directory
113

13.6.2 使用kernel32.dll练习
114

13.7 高级pe
116

13.7.1 peview.exe
116

13.7.2 patched
pe 117

13.8 小结
118

第14章 运行时压缩 121

14.1 数据压缩
121

14.1.1 无损压缩
121

14.1.2 有损压缩
121

14.2 运行时压缩器
122

14.2.1 压缩器
122

14.2.2 保护器
123

14.3 运行时压缩测试
123

第15章 调试upx压缩的notepad程序 127

15.1 notepad.exe的ep代码
127

15.2 notepad_upx.exe的ep代码
127

15.3 跟踪upx文件
129

15.3.1 ollydbg的跟踪命令
129

15.3.2 循环
#1 129

15.3.3 循环
#2 130

15.3.4 循环
#3 131

15.3.5 循环
#4 131

15.4 快速查找upx
oep的方法 132

15.4.1 在popad指令后的jmp指令处设置断点
132

15.4.2 在栈中设置硬件断点
133

15.5 小结
133

第16章 基址重定位表 135

16.1 pe重定位
135

16.1.1 dll/sys
135

16.1.2 exe
136

16.2 pe重定位时执行的操作
136

16.3 pe重定位操作原理
138

16.3.1 基址重定位表
138

16.3.2 image_base_relocation结构体
139

16.3.3 基址重定位表的分析方法
139

16.3.4 练习
141

第17章 从可执行文件中删除.reloc节区 142

17.1 .reloc节区
142

17.2 reloc.exe
142

17.2.1 删除.reloc节区头
142

17.2.2 删除.reloc节区
143

17.2.3 修改image_file_header
143

17.2.4 修改image_optional_header
144

17.3 小结
145

第18章 upack pe文件头详细分析 146

18.1 upack说明
146

18.2 使用upack压缩notepad.exe
146

18.3 使用stud_pe工具
148

18.4 比较pe文件头
148

18.4.1 原notepad.exe的pe文件头
149

18.4.2 notepad_upack.exe运行时压缩的pe文件头
149

18.5 分析upack的pe文件头
150

18.5.1 重叠文件头
150

18.5.2 image_file_header.sizeofoptionalheader
150

18.5.3 image_optional_header.numberof-rvaandsizes
152

18.5.4 image_section_header
153

18.5.5 重叠节区
155

18.5.6 rva
to raw 156

18.5.7 导入表(image_import_descriptor
array) 158

18.5.8 导入地址表
160

18.6 小结
161

第19章 upack调试 ? 查找oep 162

19.1 ollydbg运行错误
162

19.2 解码循环
163

19.3 设置iat
165

19.4 小结
166

第20章 “内嵌补丁”练习 167

20.1 内嵌补丁
167

20.2 练习:patchme
168

20.3 调试:查看代码流
168

20.4 代码结构
172

20.5
“内嵌补丁”练习 173

20.5.1 补丁代码要设置在何处呢
173

20.5.2 制作补丁代码
175

20.5.3 执行补丁代码
176

20.5.4 结果确认
177

第三部分 dll注入

第21章 windows消息钩取 180

21.1 钩子
180

21.2 消息钩子
180

21.3 setwindowshookex()
181

21.4 键盘消息钩取练习
182

21.4.1 练习示例hookmain.exe
182

21.4.2 分析源代码
185

21.5 调试练习
187

21.5.1 调试hookmain.exe
188

21.5.2 调试notepad.exe进程内的keyhook.dll
190

21.6 小结
192

第22章 恶意键盘记录器 194

22.1 恶意键盘记录器的目标
194

22.1.1 在线游戏
194

22.1.2 网上银行
194

22.1.3 商业机密泄露
194

22.2 键盘记录器的种类与发展趋势
195

22.3 防范恶意键盘记录器
195

22.4 个人信息
195

第23章 dll注入 197

23.1 dll注入
197

23.2 dll注入示例
198

23.2.1 改善功能与修复bug
198

23.2.2 消息钩取
198

23.2.3 api钩取
198

23.2.4 其他应用程序
199

23.2.5 恶意代码
199

23.3 dll注入的实现方法
199

23.4 createremotethread()
199

23.4.1 练习示例myhack.dll
199

23.4.2 分析示例源代码
203

23.4.3 调试方法
208

23.5 appinit_dlls
210

23.5.1 分析示例源码
211

23.5.2 练习示例myhack2.dll
212

23.6 setwindowshookex()
214

23.7 小结
214

第24章 dll卸载 216

24.1 dll卸载的工作原理
216

24.2 实现dll卸载
216

24.2.1 获取进程中加载的dll信息
219

24.2.2 获取目标进程的句柄
220

24.2.3 获取freelibrary()
api地址 220

24.2.4 在目标进程中运行线程
220

24.3 dll卸载练习
220

24.3.1 复制文件及运行notepad.exe
220

24.3.2 注入myhack.dll
221

24.3.3 卸载myhack.dll
222

第25章 通过修改pe加载dll 224

25.1 练习文件
224

25.1.1 textview.exe
224

25.1.2 textview_patched.exe
225

25.2 源代码
- myhack3.cpp 227

25.2.1 dllmain()
227

25.2.2 downloadurl()
228

25.2.3 dropfile()
229

25.2.4 dummy()
230

25.3 修改textview.exe文件的准备工作
231

25.3.1 修改思路
231

25.3.2 查看idt是否有足够空间
231

25.3.3 移动idt
233

25.4 修改textview.exe
235

25.4.1 修改导入表的rva值
235

25.4.2 删除绑定导入表
235

25.4.3 创建新idt
235

25.4.4 设置name、int、iat
236

25.4.5 修改iat节区的属性值
238

25.5 检测验证
240

25.6 小结
241

第26章 pe tools 242

26.1 pe
tools 242

26.1.1 进程内存转储
243

26.1.2 pe编辑器
245

26.2 小结
245

第27章 代码注入 247

27.1 代码注入
247

27.2 dll注入与代码注入
247

27.3 练习示例
249

27.3.1 运行notepad.exe
249

27.3.2 运行codeinjection.exe
249

27.3.3 弹出消息框
250

27.4 codeinjection.cpp
250

27.4.1 main()函数
251

27.4.2 threadproc()函数
251

27.4.3 injectcode()函数
254

27.5 代码注入调试练习
256

27.5.1 调试notepad.exe
256

27.5.2 设置ollydbg选项
256

27.5.3 运行codeinjection.exe
257

27.5.4 线程开始代码
258

27.6 小结
259

第28章 使用汇编语言编写注入代码 260

28.1 目标
260

28.2 汇编编程
260

28.3 ollydbg的汇编命令
260

28.3.1 编写threadproc()函数
262

28.3.2 保存文件
265

28.4 编写代码注入程序
266

28.4.1 获取threadproc()函数的二进制代码
266

28.4.2 codeinjection2.cpp
267

28.5 调试练习
270

28.5.1 调试notepad.exe
270

28.5.2 设置ollydbg选项
270

28.5.3 运行codeinjection2.exe
271

28.5.4 线程起始代码
272

28.6 详细分析
272

28.6.1 生成栈帧
272

28.6.2 thread_param结构体指针
273

28.6.3
“user32.dll”字符串 274

28.6.4 压入“user32.dll”字符串参数
274

28.6.5 调用loadlibrarya(“user32.dll”)
275

28.6.6
“messageboxa”字符串 276

28.6.7 调用getprocaddress(hmod,“messageboxa”)
276

28.6.8 压入messageboxa()函数的参数
1 - mb_ok 277

28.6.9 压入messageboxa()函数的参数
2 -“reversecore” 277

28.6.10 压入messageboxa()函数的参数
3 -“www.reversecore.com” 278

28.6.11 压入messageboxa()函数的参数
4 -null 279

28.6.12 调用messageboxa()
279

28.6.13 设置threadproc()函数的返回值
280

28.6.14 删除栈帧及函数返回
280

28.7 小结
280

第四部分 api钩取

第29章 api钩取:逆向分析之“花” 282

29.1 钩取
282

29.2 api是什么
282

29.3 api钩取
283

29.3.1 正常调用api
283

29.3.2 钩取api调用
284

29.4 技术图表
284

29.4.1 方法对象(是什么)
285

29.4.2 位置(何处)
285

29.4.3 技术(如何)
286

29.4.4 api
286

第30章 记事本writefile() api钩取
288

30.1 技术图表
- 调试技术 288

30.2 关于调试器的说明
289

30.2.1 术语
289

30.2.2 调试器功能
289

30.2.3 调试器的工作原理
289

30.2.4 调试事件
289

30.3 调试技术流程
290

30.4 练习
291

30.5 工作原理
293

30.5.1 栈
293

30.5.2 执行流
295

30.5.3
“脱钩”&“钩子” 295

30.6 源代码分析
295

30.6.1 main()
296

30.6.2 debugloop()
296

30.6.3 exit_process_debug_event
298

30.6.4 create_process_debug_event-oncreateprocess-debugevent()
298

30.6.5 exception_debug_event-onexception-debugevent()
300

第31章 关于调试器 305

31.1 ollydbg
305

31.2 ida
pro 305

31.3 windbg
306

第32章 计算器显示中文数字 308

32.1 技术图表
308

32.2 选定目标api
309

32.3 iat钩取工作原理
312

32.4 练习示例
314

32.5 源代码分析
316

32.5.1 dllmain()
316

32.5.2 mysetwindowtextw()
317

32.5.3 hook_iat()
319

32.6 调试被注入的dll文件
322

32.6.1 dllmain()
325

32.6.2 hook_iat()
325

32.6.3 mysetwindowtextw()
327

32.7 小结
328

第33章 隐藏进程 329

33.1 技术图表
329

33.2 api代码修改技术的原理
329

33.2.1 钩取之前
330

33.2.2 钩取之后
330

33.3 进程隐藏
332

33.3.1 进程隐藏工作原理
332

33.3.2 相关api
332

33.3.3 隐藏技术的问题
333

33.4 练习
#1(hideproc.exe,stealth.dll) 333

33.4.1 运行notepad.exe、procexp.exe、taskmgr.exe
334

33.4.2 运行hideproc.exe
334

33.4.3 确认stealth.dll注入成功
334

33.4.4 查看notepad.exe进程是否隐藏成功
335

33.4.5 取消notepad.exe进程隐藏
336

33.5 源代码分析
336

33.5.1 hideproc.cpp
336

33.5.2 stealth.cpp
338

33.6 全局api钩取
344

33.6.1 kernel32.createprocess()
api 344

33.6.2 ntdll.zwresumethread()
api 345

33.7 练习#2(hideproc2.exe,stealth2.dll)
345

33.7.1 复制stealth2.dll文件到%system%文件夹中
345

33.7.2 运行hideproc2.exe
-hide 346

33.7.3 运行procexp.exe?epad.exe
346

33.7.4 运行hideproc2.exe
-show 347

33.8 源代码分析
348

33.8.1 hideproc2.cpp
348

33.8.2 stealth2.cpp
348

33.9 利用“热补丁”技术钩取api
350

33.9.1 api代码修改技术的问题
350

33.9.2
“热补丁”(修改7个字节代码) 350

33.10 练习
#3:stealth3.dll 353

33.11 源代码分析
353

33.12 使用“热补丁”api钩取技术时需要考虑的问题
356

33.13 小结
357

第34章 高级全局api钩取:ie连接控制 359

34.1 目标api
359

34.2 ie进程结构
361

34.3 关于全局api钩取的概念
362

34.3.1 常规api钩取
363

34.3.2 全局api钩取
363

34.4 ntdll!zwresumethread()
api 364

34.5 练习示例:控制ie网络连接
368

34.5.1 运行ie
368

34.5.2 注入dll
369

34.5.3 创建新选项卡
369

34.5.4 尝试连接网站
370

34.5.5 卸载dll
371

34.5.6 课外练习
372

34.6 示例源代码
372

34.6.1 dllmain()
372

34.6.2 newinternetconnectw()
373

34.6.3 newzwresumethread()
374

34.7 小结
375

第35章 优秀分析工具的五种标准 376

35.1 工具
376

35.2 代码逆向分析工程师
376

35.3 优秀分析工具的五种标准
376

35.3.1 精简工具数量
377

35.3.2 工具功能简单、使用方便
377

35.3.3 完全掌握各种功能
377

35.3.4 不断升级更新
377

35.3.5 理解工具的核心工作原理
377

35.4 熟练程度的重要性
377

第五部分 64位&windows内核6

第36章 64位计算 380

36.1 64位计算环境
380

36.1.1 64位cpu
380

36.1.2 64位os
381

36.1.3 win32
api 381

36.1.4 wow64
381

36.1.5 练习:wow64test
384

36.2 编译64位文件
385

36.2.1 microsoft
windows sdk(software development kit) 386

36.2.2 设置visual
c++ 2010 express环境 386

第37章 x64处理器 389

37.1 x64中新增或变更的项目
389

37.1.1 64位
389

37.1.2 内存
389

37.1.3 通用寄存器
389

37.1.4 call/jmp指令
390

37.1.5 函数调用约定
391

37.1.6 栈
& 栈帧 392

37.2 练习:stack32.exe
& stack64.exe 392

37.2.1 stack32.exe
392

37.2.2 stack64.exe
394

37.3 小结
397

第38章 pe32+ 398

38.1 pe32+(pe+、pe64)
398

38.1.1 image_nt_headers
398

38.1.2 image_file_header
398

38.1.3 image_optional_header
399

38.1.4 image_thunk_data
401

38.1.5 image_tls_directory
403

第39章 windbg 405

39.1 windbg
405

39.1.1 windbg的特征
405

39.1.2 运行windbg
406

39.1.3 内核调试
407

39.1.4 windbg基本指令
409

第40章 64位调试 411

40.1 x64环境下的调试器
411

40.2 64位调试
411

40.3 pe32:wow64test_x86.exe
413

40.3.1 ep代码
414

40.3.2 startup代码
414

40.3.3 main()函数
415

40.4 pe32+:wow64test_x64.exe
416

40.4.1 系统断点
416

40.4.2 ep代码
417

40.4.3 startup代码
418

40.4.4 main()函数
420

40.5 小结
423

第41章 aslr 424

41.1 windows内核版本
424

41.2 aslr
424

41.3 visual
c++ 424

41.4 aslr.exe
425

41.4.1 节区信息
426

41.4.2 image_file_header\characteristics
427

41.4.3 image_optional_header\dll
characteristics 428

41.5 练习:删除aslr功能
428

第42章 内核6中的会话 430

42.1 会话
430

42.2 会话0隔离机制
432

42.3 增强安全性
432

第43章 内核6中的dll注入 433

43.1 再现dll注入失败
433

43.1.1 源代码
433

43.1.2 注入测试
435

43.2 原因分析
436

43.2.1 调试
#1 436

43.2.2 调试
#2 438

43.3 练习:使createremotethread()正常工作
440

43.3.1 方法
#1:修改createsuspended参数值 440

43.3.2 方法
#2:操纵条件分支 441

43.4 稍作整理
443

43.5 injectdll_new.exe
443

43.5.1 injectdll_new.cpp
443

43.5.2 注入练习
446

第44章 injdll.exe:dll注入专用工具
448

44.1 injdll.exe
448

44.1.1 使用方法
448

44.1.2 使用示例
449

44.1.3 注意事项
450

第六部分 高级逆向分析技术

第45章 tls回调函数 452

45.1 练习
#1:hellotls.exe 452

45.2 tls
453

45.2.1 image_data_directory[9]
453

45.2.2 image_tls_directory
454

45.2.3 回调函数地址数组
454

45.3 tls回调函数
455

45.4 练习
#2:tlstest.exe 456

45.4.1 dll_process_attach
457

45.4.2 dll_thread_attach
457

45.4.3 dll_thread_detach
457

45.4.4 dll_process_detach
457

45.5 调试tls回调函数
458

45.6 手工添加tls回调函数
459

45.6.1 修改前的原程序
460

45.6.2 设计规划
460

45.6.3 编辑pe文件头
461

45.6.4 设置image_tls_directory结构体
463

45.6.5 编写tls回调函数
464

45.6.6 最终完成
464

45.7 小结
465

第46章 teb 466

46.1 teb
466

46.1.1 teb结构体的定义
466

46.1.2 teb结构体成员
466

46.1.3 重要成员
469

46.2 teb访问方法
470

46.2.1 ntdll.ntcurrentteb()
470

46.2.2 fs段寄存器
471

46.3 小结
472

第47章 peb 473

47.1 peb
473

47.1.1 peb访问方法
473

47.1.2 peb结构体的定义
474

47.1.3 peb结构体的成员
475

47.2 peb的重要成员
477

47.2.1 peb.beingdebugged
478

47.2.2 peb.imagebaseaddress
478

47.2.3 peb.ldr
479

47.2.4 peb.processheap
& peb.ntglobalflag 480

47.3 小结
480

第48章 seh 481

48.1 seh
481

48.2 seh练习示例
#1 481

48.2.1 正常运行
481

48.2.2 调试运行
482

48.3 os的异常处理方法
484

48.3.1 正常运行时的异常处理方法
484

48.3.2 调试运行时的异常处理方法
484

48.4 异常
485

48.4.1 exception_access_violation(c0000005)
486

48.4.2 exception_breakpoint(80000003)
486

48.4.3 exception_illegal_instruction(c000001d)
488

48.4.4 exception_int_divide_by_zero(c0000094)
488

48.4.5 exception_single_step(80000004)
489

48.5 seh详细说明
489

48.5.1 seh链
489

48.5.2 异常处理函数的定义
489

48.5.3 teb.nttib.exceptionlist
491

48.5.4 seh安装方法
492

48.6 seh练习示例
#2(seh.exe) 492

48.6.1 查看seh链
493

48.6.2 添加seh
493

48.6.3 发生异常
494

48.6.4 查看异常处理器参数
494

48.6.5 调试异常处理器
496

48.6.6 删除seh
498

48.7 设置ollydbg选项
499

48.7.1 忽略kernel32中发生的内存非法访问异常
500

48.7.2 向被调试者派送异常
500

48.7.3 其他异常处理
500

48.7.4 简单练习
500

48.8 小结
501

第49章 ia-32指令 502

49.1 ia-32指令
502

49.2 常用术语
502

49.2.1 反汇编器
503

49.2.2 反编译器
504

49.2.3 反编译简介
504

49.3 ia-32指令格式
506

49.3.1 指令前缀
507

49.3.2 操作码
507

49.3.3 modr/m
507

49.3.4 sib
508

49.3.5 位移
508

49.3.6 立即数
509

49.4 指令解析手册
509

49.4.1 下载ia-32用户手册
509

49.4.2 打印指令解析手册
509

49.5 指令解析练习
510

49.5.1 操作码映射
510

49.5.2 操作数
511

49.5.3 modr/m
512

49.5.4 group
514

49.5.5 前缀
516

49.5.6 双字节操作码
518

49.5.7 移位值&立即数
519

49.5.8 sib
520

49.6 指令解析课外练习
524

49.7 小结
524

第七部分 反调试技术

第50章 反调试技术 526

50.1 反调试技术
526

50.1.1 依赖性
526

50.1.2 多种反调试技术
526

50.2 反调试破解技术
526

50.3 反调试技术的分类
527

50.3.1 静态反调试技术
528

50.3.2 动态反调试技术
528

第51章 静态反调试技术 529

51.1 静态反调试的目的
529

51.2 peb
529

51.2.1 beingdebugged(+0x2)
531

51.2.2 ldr(+0xc)
531

51.2.3 process
heap(+0x18) 532

51.2.4 ntglobalflag(+0x68)
533

51.2.5 练习:?staad_peb.exe
534

51.2.6 破解之法
534

51.3 ntqueryinformationprocess()
537

51.3.1 processdebugport(0x7)
538

51.3.2 processdebugobjecthandle(0x1e)
539

51.3.3 processdebugflags(0x1f)
539

51.3.4 练习:staad_ntqip.exe
540

51.3.5 破解之法
540

51.4 ntquerysysteminformation()
542

51.4.1 systemkerneldebugger-information(0x23)
544

51.4.2 练习:staad_ntqsi.exe
545

51.4.3 破解之法
545

51.5 ntqueryobject()
545

51.6 zwsetinformationthread()
549

51.6.1 练习:staad_zwsit.exe
549

51.6.2 破解之法
550

51.7 tls回调函数
550

51.8 etc
551

51.8.1 练习:staad_findwindow.exe
551

51.8.2 破解之法
551

51.9 小结
553

第52章 动态反调试技术 554

52.1 动态反调试技术的目的
554

52.2 异常
554

52.2.1 seh
554

52.2.2 setunhandledexception-filter()
558

52.3 timing
check 562

52.3.1 时间间隔测量法
562

52.3.2 rdtsc
563

52.4 陷阱标志
565

52.4.1 单步执行
566

52.4.2 int
2d 569

52.5 0xcc探测
572

52.5.1 api断点
573

52.5.2 比较校验和
575

第53章 高级反调试技术 577

53.1 高级反调试技术
577

53.2 垃圾代码
577

53.3 扰乱代码对齐
578

53.4 加密/解密
581

53.4.1 简单的解码示例
581

53.4.2 复杂的解码示例
582

53.4.3 特殊情况:代码重组
584

53.5 stolen
bytes(remove oep) 584

53.6 api重定向
587

53.6.1 原代码
588

53.6.2 api重定向示例
#1 588

53.6.3 api重定向示例#2
589

53.7 debug
blocker(self debugging) 593

53.8 小结
595

第八部分 调试练习

第54章 调试练习1:服务 598

54.1 服务进程的工作原理
598

54.1.1 服务控制器
598

54.1.2 服务启动过程
599

54.2 debugme1.exe示例讲解
600

54.2.1 安装服务
600

54.2.2 启动服务
602

54.2.3 源代码
604

54.3 服务进程的调试
606

54.3.1 问题在于scm
606

54.3.2 调试器无所不能
606

54.3.3 常用方法
606

54.4 服务调试练习
606

54.4.1 直接调试:强制设置eip
606

54.4.2 服务调试的常用方法:“附加”方式
609

54.5 小结
615

第55章 调试练习2:自我创建 616

55.1 自我创建
616

55.2 工作原理
617

55.2.1 创建子进程(挂起模式)
617

55.2.2 更改eip
618

55.2.3 恢复主线程
618

55.3 示例程序源代码
618

55.4 调试练习
620

55.4.1 需要考虑的事项
620

55.4.2 jit调试
621

55.4.3 debugme2.exe
622

55.5 小结
626

第56章 调试练习3:pe映像切换 627

56.1 pe映像
627

56.2 pe映像切换
628

56.3 示例程序:fake.exe、real.exe、debugme3.exe
628

56.4 调试1
631

56.4.1 open
? 输入运行参数 631

56.4.2 main()函数
632

56.4.3 subfunc_1()
634

56.4.4 createprocess(“fake.exe”,create_suspended)
635

56.4.5 subfunc_2()
635

56.4.6 subfunc_3()
641

56.4.7 resumethread()
644

56.5 调试2
644

56.5.1 思考
645

56.5.2 向ep设置无限循环
645

56.6 小结
647

第57章 调试练习4:debug blocker
648

57.1 debug
blocker 648

57.2 反调试特征
648

57.2.1 父与子的关系
649

57.2.2 被调试进程不能再被其他调试器调试
649

57.2.3 终止调试进程的同时也终止被调试进程
649

57.2.4 调试器操作被调试者的代码
649

57.2.5 调试器处理被调试进程中发生的异常
649

57.3 调试练习:debugme4.exe
650

57.4 第一次调试
650

57.4.1 选定调试的起始位置
650

57.4.2 main()
650

57.5 第二次调试
651

57.6 第三次调试
653

57.7 第四次调试
656

57.8 第五次调试
658

57.8.1 系统断点
658

57.8.2 exception_illegal_instruction(1)
659

57.8.3 exception_illegal_instruction(2)
660

57.9 第六次调试
661

57.9.1 40121d(第一个异常)
661

57.9.2 401299(第二个异常)
665

57.10 第七次调试
667

57.10.1 静态方法
668

57.10.2 动态方法
669

57.11 小结
673

结束语
674

索引
676

本图书信息来源:互动出版网

时间: 2024-10-18 21:10:47

《逆向工程核心原理》的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: