|
-- 會員 / 註冊 --
|
|
|
|
逆向工程核心原理 ( 簡體 字) |
作者:[韓]李承遠 著 | 類別:1. -> 程式設計 -> 綜合 |
譯者: |
出版社:人民郵電出版社 | 3dWoo書號: 54729 詢問書籍請說出此書號!【缺書】 NT售價: 650 元 |
出版日:6/1/2021 |
頁數:679 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787115350183 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言: |
內容簡介: 《逆向工程核心原理》十分詳盡地介紹了代碼逆向分析的核心原理。作者在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章 棧 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 |
序: |
|