逆向工程 核心原理pdf

圖書網
圖書網
圖書網
10560
文章
1403
評論
2018年9月6日09:12:15 評論 1.3K
摘要

逆向分析師必知核心原理大全!
《逆向工程核心原理》集中講解逆向分析技術及其操作原理,不僅通過通俗易懂的語言介紹了每項技術,更通過豐富的示例使讀者徹底掌握核心部分的原理。閱讀此書不僅可以為逆向分析打下堅實基礎,更能夠獲得恒久保值的技術精髓。

逆向工程 核心原理 內容簡介

《逆向工程核心原理》十分詳盡地介紹了代碼逆向分析的核心原理。作者在Ahnlab 研究所工作多年,書中不僅包括其以此經驗為基礎親自編寫的大量代碼,還包含了逆向工程研究人員必須了解的各種技術和技巧。徹底理解并切實掌握逆向工程這門技術,就能在眾多IT相關領域進行拓展運用,這本《逆向工程核心原理》就是通向逆向工程大門的捷徑。

想成為逆向工程研究員的讀者或正在從事逆向開發工作的開發人員一定會通過《逆向工程核心原理》獲得很大幫助。同時,想成為安全領域專家的人也可從《逆向工程核心原理》輕松起步。

逆向工程 核心原理 目錄

第一部分 代碼逆向技術基礎

第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章 ?!?1

5.1 ?!?1

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 將參數壓入?!?7

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?。畆eloc節區 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鉤?。耗嫦蚍治鲋盎ā薄?82

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 ?!?93

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鉤?。篒E連接控制 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 異?!?85

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 發生異?!?94

48.6.4 查看異常處理器參數 494

48.6.5 調試異常處理器 496

48.6.6 刪除SEH 498

48.7 設置OllyDbg選項 499

48.7.1 忽略KERNEL32中發生的內存非法訪問異?!?00

48.7.2 向被調試者派送異?!?00

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 異?!?54

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 調試器處理被調試進程中發生的異?!?49

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

逆向工程 核心原理 精彩文摘

第49章 IA-32指令

本章將學習有關IA-32指令(或稱x86指令)的內容。各位剛開始會覺得指令比較復雜,但若理解了指令的解析方法與原理,就能夠輕松地將指令轉換為反匯編代碼。掌握了這些內容后,各位的逆向分析技術水平將提高到一個新的層次。

圖書網:逆向工程 核心原理pdf

繼續閱讀
  • 我的微信
  • 掃一掃加好友
  • weinxin
  • 微信公眾號
  • 掃一掃關注
  • weinxin
移動Web前端高效開發實戰epub 軟件工程/開發項目管理

移動Web前端高效開發實戰epub

適讀人群 :移動Web開發初學者和前端愛好者,APP的Native客戶端開發人員,網頁和移動網頁從業人員,從事后端開發對前端有興趣的人員,大中專院校的學生,可作為各種培訓學校的入門...
匿名

發表評論

匿名網友 填寫信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: