關(guān)于我們
書單推薦
新書推薦
|
逆向工程核心原理
《逆向工程核心原理》十分詳盡地介紹了代碼逆向分析的核心原理。作者在Ahnlab 研究所工作多年,書中不僅包括其以此經(jīng)驗(yàn)為基礎(chǔ)親自編寫的大量代碼,還包含了逆向工程研究人員必須了解的各種技術(shù)和技巧。徹底理解并切實(shí)掌握逆向工程這門技術(shù),就 能在眾多IT相關(guān)領(lǐng)域進(jìn)行拓展運(yùn)用,這本《逆向工程核心原理》就是通向逆向工程大門的捷徑。
想成為逆向工程研究員的讀者或正在從事逆向開發(fā)工作的開發(fā)人員一定會(huì)通過《逆向工程核心原理》獲得很大幫助。同時(shí),想成為 安全領(lǐng)域?qū)<业娜艘部蓮摹赌嫦蚬こ毯诵脑怼份p松起步。
書中用到的幾乎所有示例都基于作者在逆向分析實(shí)踐中獲得的知識(shí)與經(jīng)驗(yàn),是其親自開發(fā)的程序,緊扣各章主題,絕無累贅。
作者將培訓(xùn)經(jīng)驗(yàn)應(yīng)用到本書的組織結(jié)構(gòu)、內(nèi)容講解、示例選擇等各方面,以求將較為難懂的技術(shù)以更易懂的方式呈現(xiàn)給各位。 作者幾年前就開設(shè)了一個(gè)逆向技術(shù)學(xué)習(xí)博客并運(yùn)營(yíng)至今,通過與訪問者之間的交流,充分了解了初學(xué)者們的困惑和需求。
李承遠(yuǎn)
在AhnLab從事惡意代碼分析工作,一直維護(hù)著一個(gè)逆向分析技術(shù)專業(yè)學(xué)習(xí)博客。從接觸逆向分析技術(shù)開始就為其迷人魅力深深吸引,對(duì)逆向分析技術(shù)的傳播及多領(lǐng)域應(yīng)用非常關(guān)注,喜歡讀書、發(fā)呆,也向往新的挑戰(zhàn)。
第一部分 代碼逆向技術(shù)基礎(chǔ)
第1章 關(guān)于逆向工程 2 1 1 逆向工程 2 1 2 代碼逆向工程 2 1 2 1 逆向分析法 2 1 2 2 源代碼、十六進(jìn)制代碼、匯編代碼 4 1 2 3 “打補(bǔ)丁”與“破解” 5 1 3 代碼逆向準(zhǔn)備 5 1 3 1 目標(biāo) 5 1 3 2 激情 6 1 3 3 谷歌 6 1 4 學(xué)習(xí)逆向分析技術(shù)的禁忌 6 1 4 1 貪心 6 1 4 2 急躁 7 1 5 逆向分析技術(shù)的樂趣 7 第2章 逆向分析Hello World!程序 8 2 1 Hello World!程序 8 2 2 調(diào)試HelloWorld exe程序 9 2 2 1 調(diào)試目標(biāo) 9 2 2 2 開始調(diào)試 9 2 2 3 入口點(diǎn) 10 2 2 4 跟蹤40270C函數(shù) 10 2 2 5 跟蹤40104F跳轉(zhuǎn)語(yǔ)句 12 2 2 6 查找main()函數(shù) 12 2 3 進(jìn)一步熟悉調(diào)試器 14 2 3 1 調(diào)試器指令 14 2 3 2 “大本營(yíng)” 15 2 3 3 設(shè)置“大本營(yíng)”的四種方法 15 2 4 快速查找指定代碼的四種方法 17 2 4 1 代碼執(zhí)行法 18 2 4 2 字符串檢索法 19 2 4 3 API檢索法(1):在調(diào)用代碼中設(shè)置斷點(diǎn) 20 2 4 4 API檢索法(2):在API代碼中設(shè)置斷點(diǎn) 21 2 5 使用“打補(bǔ)丁”方式修改“Hello World!”字符串 23 2 5 1 “打補(bǔ)丁” 23 2 5 2 修改字符串的兩種方法 24 2 6 小結(jié) 28 第3章 小端序標(biāo)記法 31 3 1 字節(jié)序 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 小結(jié) 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 開始調(diào)試 45 6 1 2 分析代碼 45 6 2 破解 47 6 3 將參數(shù)壓入棧 47 6 4 小結(jié) 48 第7章 棧幀 49 7 1 棧幀 49 7 2 調(diào)試示例:stackframe exe 49 7 2 1 StackFrame cpp 50 7 2 2 開始執(zhí)行main()函數(shù)&生成棧幀 51 7 2 3 設(shè)置局部變量 52 7 2 4 add()函數(shù)參數(shù)傳遞與調(diào)用 53 7 2 5 開始執(zhí)行add()函數(shù)&生成棧幀 54 7 2 6 設(shè)置add()函數(shù)的局部變量(x, y) 55 7 2 7 ADD運(yùn)算 55 7 2 8 刪除函數(shù)add()的棧幀&函數(shù)執(zhí)行完畢(返回) 56 7 2 9 從棧中刪除函數(shù)add()的參數(shù)(整理?xiàng)? 57 7 2 10 調(diào)用printf()函數(shù) 58 7 2 11 設(shè)置返回值 58 7 2 12 刪除棧幀&main()函數(shù)終止 58 7 3 設(shè)置OllyDbg選項(xiàng) 59 7 3 1 Disasm選項(xiàng) 59 7 3 2 Analysis1選項(xiàng) 60 7 4 小結(jié) 61 第8章 abex’ crackme #2 62 8 1 運(yùn)行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 未文檔化的結(jié)構(gòu)體 63 8 3 開始調(diào)試 63 8 3 1 間接調(diào)用 64 8 3 2 RT_MainStruct結(jié)構(gòu)體 64 8 3 3 ThunRTMain()函數(shù) 65 8 4 分析crackme 65 8 4 1 檢索字符串 65 8 4 2 查找字符串地址 66 8 4 3 生成Serial的算法 68 8 4 4 預(yù)測(cè)代碼 69 8 4 5 讀取Name字符串的代碼 69 8 4 6 加密循環(huán) 70 8 4 7 加密方法 70 8 5 小結(jié) 72 第9章 Process Explorer——最優(yōu)秀的進(jìn)程管理工具 74 9 1 Process Explorer 74 9 2 具體有哪些優(yōu)點(diǎn)呢 75 9 3 sysinternals 75 第10章 函數(shù)調(diào)用約定 76 10 1 函數(shù)調(diào)用約定 76 10 1 1 cdecl 76 10 1 2 stdcall 77 10 1 3 fastcall 78 第11章 視頻講座 79 11 1 運(yùn)行 79 11 2 分析 79 11 2 1 目標(biāo)(1):去除消息框 79 11 2 2 打補(bǔ)丁(1):去除消息框 81 11 2 3 目標(biāo)(2):查找注冊(cè)碼 83 11 3 小結(jié) 85 第12章 究竟應(yīng)當(dāng)如何學(xué)習(xí)代碼逆向分析 86 12 1 逆向工程 86 12 1 1 任何學(xué)習(xí)都應(yīng)當(dāng)有目標(biāo) 86 12 1 2 擁有積極心態(tài) 86 12 1 3 要感受其中的樂趣 86 12 1 4 讓檢索成為日常生活的一部分 87 12 1 5 最重要的是實(shí)踐 87 12 1 6 請(qǐng)保持平和的心態(tài) 87 第二部分 PE文件格式 第13章 PE文件格式 90 13 1 介紹 90 13 2 PE文件格式 90 13 2 1 基本結(jié)構(gòu) 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 節(jié)區(qū)頭 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練習(xí) 108 13 6 EAT 112 13 6 1 IMAGE_EXPORT_DIRECTORY 113 13 6 2 使用kernel32 dll練習(xí) 114 13 7 高級(jí)PE 116 13 7 1 PEView exe 116 13 7 2 Patched PE 117 13 8 小結(jié) 118 第14章 運(yùn)行時(shí)壓縮 121 14 1 數(shù)據(jù)壓縮 121 14 1 1 無損壓縮 121 14 1 2 有損壓縮 121 14 2 運(yùn)行時(shí)壓縮器 122 14 2 1 壓縮器 122 14 2 2 保護(hù)器 123 14 3 運(yùn)行時(shí)壓縮測(cè)試 123 第15章 調(diào)試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 循環(huán) #1 129 15 3 3 循環(huán) #2 130 15 3 4 循環(huán) #3 131 15 3 5 循環(huán) #4 131 15 4 快速查找UPX OEP的方法 132 15 4 1 在POPAD指令后的JMP指令處設(shè)置斷點(diǎn) 132 15 4 2 在棧中設(shè)置硬件斷點(diǎn) 133 15 5 小結(jié) 133 第16章 基址重定位表 135 16 1 PE重定位 135 16 1 1 DLL/SYS 135 16 1 2 EXE 136 16 2 PE重定位時(shí)執(zhí)行的操作 136 16 3 PE重定位操作原理 138 16 3 1 基址重定位表 138 16 3 2 IMAGE_BASE_RELOCATION結(jié)構(gòu)體 139 16 3 3 基址重定位表的分析方法 139 16 3 4 練習(xí) 141 第17章 從可執(zhí)行文件中刪除 reloc節(jié)區(qū) 142 17 1 reloc節(jié)區(qū) 142 17 2 reloc exe 142 17 2 1 刪除 reloc節(jié)區(qū)頭 142 17 2 2 刪除 reloc節(jié)區(qū) 143 17 2 3 修改IMAGE_FILE_HEADER 143 17 2 4 修改IMAGE_OPTIONAL_HEADER 144 17 3 小結(jié) 145 第18章 UPack PE文件頭詳細(xì)分析 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運(yùn)行時(shí)壓縮的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 重疊節(jié)區(qū) 155 18 5 6 RVA to RAW 156 18 5 7 導(dǎo)入表(IMAGE_IMPORT_DESCRIPTOR array) 158 18 5 8 導(dǎo)入地址表 160 18 6 小結(jié) 161 第19章 UPack調(diào)試? 查找OEP 162 19 1 OllyDbg運(yùn)行錯(cuò)誤 162 19 2 解碼循環(huán) 163 19 3 設(shè)置IAT 165 19 4 小結(jié) 166 第20章 “內(nèi)嵌補(bǔ)丁”練習(xí) 167 20 1 內(nèi)嵌補(bǔ)丁 167 20 2 練習(xí):Patchme 168 20 3 調(diào)試:查看代碼流 168 20 4 代碼結(jié)構(gòu) 172 20 5 “內(nèi)嵌補(bǔ)丁”練習(xí) 173 20 5 1 補(bǔ)丁代碼要設(shè)置在何處呢 173 20 5 2 制作補(bǔ)丁代碼 175 20 5 3 執(zhí)行補(bǔ)丁代碼 176 20 5 4 結(jié)果確認(rèn) 177 第三部分 DLL注入 第21章 Windows消息鉤取 180 21 1 鉤子 180 21 2 消息鉤子 180 21 3 SetWindowsHookEx() 181 21 4 鍵盤消息鉤取練習(xí) 182 21 4 1 練習(xí)示例HookMain exe 182 21 4 2 分析源代碼 185 21 5 調(diào)試練習(xí) 187 21 5 1 調(diào)試HookMain exe 188 21 5 2 調(diào)試Notepad exe進(jìn)程內(nèi)的KeyHook dll 190 21 6 小結(jié) 192 第22章 惡意鍵盤記錄器 194 22 1 惡意鍵盤記錄器的目標(biāo) 194 22 1 1 在線游戲 194 22 1 2 網(wǎng)上銀行 194 22 1 3 商業(yè)機(jī)密泄露 194 22 2 鍵盤記錄器的種類與發(fā)展趨勢(shì) 195 22 3 防范惡意鍵盤記錄器 195 22 4 個(gè)人信息 195 第23章 DLL注入 197 23 1 DLL注入 197 23 2 DLL注入示例 198 23 2 1 改善功能與修復(fù)Bug 198 23 2 2 消息鉤取 198 23 2 3 API鉤取 198 23 2 4 其他應(yīng)用程序 199 23 2 5 惡意代碼 199 23 3 DLL注入的實(shí)現(xiàn)方法 199 23 4 CreateRemoteThread() 199 23 4 1 練習(xí)示例myhack dll 199 23 4 2 分析示例源代碼 203 23 4 3 調(diào)試方法 208 23 5 AppInit_DLLs 210 23 5 1 分析示例源碼 211 23 5 2 練習(xí)示例myhack2 dll 212 23 6 SetWindowsHookEx() 214 23 7 小結(jié) 214 第24章 DLL卸載 216 24 1 DLL卸載的工作原理 216 24 2 實(shí)現(xiàn)DLL卸載 216 24 2 1 獲取進(jìn)程中加載的DLL信息 219 24 2 2 獲取目標(biāo)進(jìn)程的句柄 220 24 2 3 獲取FreeLibrary() API地址 220 24 2 4 在目標(biāo)進(jìn)程中運(yùn)行線程 220 24 3 DLL卸載練習(xí) 220 24 3 1 復(fù)制文件及運(yùn)行notepad exe 220 24 3 2 注入myhack dll 221 24 3 3 卸載myhack dll 222 第25章 通過修改PE加載DLL 224 25 1 練習(xí)文件 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文件的準(zhǔn)備工作 231 25 3 1 修改思路 231 25 3 2 查看IDT是否有足夠空間 231 25 3 3 移動(dòng)IDT 233 25 4 修改TextView exe 235 25 4 1 修改導(dǎo)入表的RVA值 235 25 4 2 刪除綁定導(dǎo)入表 235 25 4 3 創(chuàng)建新IDT 235 25 4 4 設(shè)置Name、INT、IAT 236 25 4 5 修改IAT節(jié)區(qū)的屬性值 238 25 5 檢測(cè)驗(yàn)證 240 25 6 小結(jié) 241 第26章 PE Tools 242 26 1 PE Tools 242 26 1 1 進(jìn)程內(nèi)存轉(zhuǎn)儲(chǔ) 243 26 1 2 PE編輯器 245 26 2 小結(jié) 245 第27章 代碼注入 247 27 1 代碼注入 247 27 2 DLL注入與代碼注入 247 27 3 練習(xí)示例 249 27 3 1 運(yùn)行notepad exe 249 27 3 2 運(yùn)行CodeInjection exe 249 27 3 3 彈出消息框 250 27 4 CodeInjection cpp 250 27 4 1 main()函數(shù) 251 27 4 2 ThreadProc()函數(shù) 251 27 4 3 InjectCode()函數(shù) 254 27 5 代碼注入調(diào)試練習(xí) 256 27 5 1 調(diào)試notepad exe 256 27 5 2 設(shè)置OllyDbg選項(xiàng) 256 27 5 3 運(yùn)行CodeInjection exe 257 27 5 4 線程開始代碼 258 27 6 小結(jié) 259 第28章 使用匯編語(yǔ)言編寫注入代碼 260 28 1 目標(biāo) 260 28 2 匯編編程 260 28 3 OllyDbg的匯編命令 260 28 3 1 編寫ThreadProc()函數(shù) 262 28 3 2 保存文件 265 28 4 編寫代碼注入程序 266 28 4 1 獲取ThreadProc()函數(shù)的二進(jìn)制代碼 266 28 4 2 CodeInjection2 cpp 267 28 5 調(diào)試練習(xí) 270 28 5 1 調(diào)試notepad exe 270 28 5 2 設(shè)置OllyDbg選項(xiàng) 270 28 5 3 運(yùn)行CodeInjection2 exe 271 28 5 4 線程起始代碼 272 28 6 詳細(xì)分析 272 28 6 1 生成棧幀 272 28 6 2 THREAD_PARAM結(jié)構(gòu)體指針 273 28 6 3 “User32 dll”字符串 274 28 6 4 壓入“user32 dll”字符串參數(shù) 274 28 6 5 調(diào)用LoadLibraryA(“user32 dll”) 275 28 6 6 “MessageBoxA”字符串 276 28 6 7 調(diào)用GetProcAddress(hMod,“MessageBoxA”) 276 28 6 8 壓入MessageBoxA()函數(shù)的參數(shù) 1 -MB_OK 277 28 6 9 壓入MessageBoxA()函數(shù)的參數(shù) 2 -“ReverseCore” 277 28 6 10 壓入MessageBoxA()函數(shù)的參數(shù) 3 -“ reversecore ” 278 28 6 11 壓入MessageBoxA()函數(shù)的參數(shù) 4 -NULL 279 28 6 12 調(diào)用MessageBoxA() 279 28 6 13 設(shè)置ThreadProc()函數(shù)的返回值 280 28 6 14 刪除棧幀及函數(shù)返回 280 28 7 小結(jié) 280 第四部分 API鉤取 第29章 API鉤。耗嫦蚍治鲋盎ā 282 29 1 鉤取 282 29 2 API是什么 282 29 3 API鉤取 283 29 3 1 正常調(diào)用API 283 29 3 2 鉤取API調(diào)用 284 29 4 技術(shù)圖表 284 29 4 1 方法對(duì)象(是什么) 285 29 4 2 位置(何處) 285 29 4 3 技術(shù)(如何) 286 29 4 4 API 286 第30章 記事本W(wǎng)riteFile() API鉤取 288 30 1 技術(shù)圖表—調(diào)試技術(shù) 288 30 2 關(guān)于調(diào)試器的說明 289 30 2 1 術(shù)語(yǔ) 289 30 2 2 調(diào)試器功能 289 30 2 3 調(diào)試器的工作原理 289 30 2 4 調(diào)試事件 289 30 3 調(diào)試技術(shù)流程 290 30 4 練習(xí) 291 30 5 工作原理 293 30 5 1 棧 293 30 5 2 執(zhí)行流 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章 關(guān)于調(diào)試器 305 31 1 OllyDbg 305 31 2 IDA Pro 305 31 3 WinDbg 306 第32章 計(jì)算器顯示中文數(shù)字 308 32 1 技術(shù)圖表 308 32 2 選定目標(biāo)API 309 32 3 IAT鉤取工作原理 312 32 4 練習(xí)示例 314 32 5 源代碼分析 316 32 5 1 DllMain() 316 32 5 2 MySetWindowTextW() 317 32 5 3 hook_iat() 319 32 6 調(diào)試被注入的DLL文件 322 32 6 1 DllMain() 325 32 6 2 hook_iat() 325 32 6 3 MySetWindowTextW() 327 32 7 小結(jié) 328 第33章 隱藏進(jìn)程 329 33 1 技術(shù)圖表 329 33 2 API代碼修改技術(shù)的原理 329 33 2 1 鉤取之前 330 33 2 2 鉤取之后 330 33 3 進(jìn)程隱藏 332 33 3 1 進(jìn)程隱藏工作原理 332 33 3 2 相關(guān)API 332 33 3 3 隱藏技術(shù)的問題 333 33 4 練習(xí) #1(HideProc exe,stealth dll) 333 33 4 1 運(yùn)行notepad exe、procexp exe、taskmgr exe 334 33 4 2 運(yùn)行HideProc exe 334 33 4 3 確認(rèn)stealth dll注入成功 334 33 4 4 查看notepad exe進(jìn)程是否隱藏成功 335 33 4 5 取消notepad exe進(jìn)程隱藏 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 練習(xí)#2(HideProc2 exe,Stealth2 dll) 345 33 7 1 復(fù)制stealth2 dll文件到%SYSTEM%文件夾中 345 33 7 2 運(yùn)行HideProc2 exe -hide 346 33 7 3 運(yùn)行ProcExp exe¬epad exe 346 33 7 4 運(yùn)行HideProc2 exe -show 347 33 8 源代碼分析 348 33 8 1 HideProc2 cpp 348 33 8 2 stealth2 cpp 348 33 9 利用“熱補(bǔ)丁”技術(shù)鉤取API 350 33 9 1 API代碼修改技術(shù)的問題 350 33 9 2 “熱補(bǔ)丁”(修改7個(gè)字節(jié)代碼) 350 33 10 練習(xí) #3:stealth3 dll 353 33 11 源代碼分析 353 33 12 使用“熱補(bǔ)丁”API鉤取技術(shù)時(shí)需要考慮的問題 356 33 13 小結(jié) 357 第34章 高級(jí)全局API鉤。篒E連接控制 359 34 1 目標(biāo)API 359 34 2 IE進(jìn)程結(jié)構(gòu) 361 34 3 關(guān)于全局API鉤取的概念 362 34 3 1 常規(guī)API鉤取 363 34 3 2 全局API鉤取 363 34 4 ntdll!ZwResumeThread() API 364 34 5 練習(xí)示例:控制IE網(wǎng)絡(luò)連接 368 34 5 1 運(yùn)行IE 368 34 5 2 注入DLL 369 34 5 3 創(chuàng)建新選項(xiàng)卡 369 34 5 4 嘗試連接網(wǎng)站 370 34 5 5 卸載DLL 371 34 5 6 課外練習(xí) 372 34 6 示例源代碼 372 34 6 1 DllMain() 372 34 6 2 NewInterConnectW() 373 34 6 3 NewZwResumeThread() 374 34 7 小結(jié) 375 第35章 優(yōu)秀分析工具的五種標(biāo)準(zhǔn) 376 35 1 工具 376 35 2 代碼逆向分析工程師 376 35 3 優(yōu)秀分析工具的五種標(biāo)準(zhǔn) 376 35 3 1 精簡(jiǎn)工具數(shù)量 377 35 3 2 工具功能簡(jiǎn)單、使用方便 377 35 3 3 完全掌握各種功能 377 35 3 4 不斷升級(jí)更新 377 35 3 5 理解工具的核心工作原理 377 35 4 熟練程度的重要性 377 第五部分 64位&Windows內(nèi)核6 第36章 64位計(jì)算 380 36 1 64位計(jì)算環(huán)境 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 練習(xí):WOW64Test 384 36 2 編譯64位文件 385 36 2 1 Microsoft Windows SDK(Software Development Kit) 386 36 2 2 設(shè)置Visual C 2010 Express環(huán)境 386 第37章 x64處理器 389 37 1 x64中新增或變更的項(xiàng)目 389 37 1 1 64位 389 37 1 2 內(nèi)存 389 37 1 3 通用寄存器 389 37 1 4 CALL/JMP指令 390 37 1 5 函數(shù)調(diào)用約定 391 37 1 6 棧 & 棧幀 392 37 2 練習(xí):Stack32 exe & Stack64 exe 392 37 2 1 Stack32 exe 392 37 2 2 Stack64 exe 394 37 3 小結(jié) 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 運(yùn)行WinDbg 406 39 1 3 內(nèi)核調(diào)試 407 39 1 4 WinDbg基本指令 409 第40章 64位調(diào)試 411 40 1 x64環(huán)境下的調(diào)試器 411 40 2 64位調(diào)試 411 40 3 PE32:WOW64Test_x86 exe 413 40 3 1 EP代碼 414 40 3 2 Startup代碼 414 40 3 3 main()函數(shù) 415 40 4 PE32 :WOW64Test_x64 exe 416 40 4 1 系統(tǒng)斷點(diǎn) 416 40 4 2 EP代碼 417 40 4 3 Startup代碼 418 40 4 4 main()函數(shù) 420 40 5 小結(jié) 423 第41章 ASLR 424 41 1 Windows內(nèi)核版本 424 41 2 ASLR 424 41 3 Visual C 424 41 4 ASLR exe 425 41 4 1 節(jié)區(qū)信息 426 41 4 2 IMAGE_FILE_HEADER\Characteristics 427 41 4 3 IMAGE_OPTIONAL_HEADER\DLL Characteristics 428 41 5 練習(xí):刪除ASLR功能 428 第42章 內(nèi)核6中的會(huì)話 430 42 1 會(huì)話 430 42 2 會(huì)話0隔離機(jī)制 432 42 3 增強(qiáng)安全性 432 第43章 內(nèi)核6中的DLL注入 433 43 1 再現(xiàn)DLL注入失敗 433 43 1 1 源代碼 433 43 1 2 注入測(cè)試 435 43 2 原因分析 436 43 2 1 調(diào)試 #1 436 43 2 2 調(diào)試 #2 438 43 3 練習(xí):使CreateRemoteThread()正常工作 440 43 3 1 方法 #1:修改CreateSuspended參數(shù)值 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 注入練習(xí) 446 第44章 InjDll exe:DLL注入專用工具 448 44 1 InjDll exe 448 44 1 1 使用方法 448 44 1 2 使用示例 449 44 1 3 注意事項(xiàng) 450 第六部分 高級(jí)逆向分析技術(shù) 第45章 TLS回調(diào)函數(shù) 452 45 1 練習(xí) #1:HelloTls exe 452 45 2 TLS 453 45 2 1 IMAGE_DATA_DIRECTORY 453 45 2 2 IMAGE_TLS_DIRECTORY 454 45 2 3 回調(diào)函數(shù)地址數(shù)組 454 45 3 TLS回調(diào)函數(shù) 455 45 4 練習(xí) #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 調(diào)試TLS回調(diào)函數(shù) 458 45 6 手工添加TLS回調(diào)函數(shù) 459 45 6 1 修改前的原程序 460 45 6 2 設(shè)計(jì)規(guī)劃 460 45 6 3 編輯PE文件頭 461 45 6 4 設(shè)置IMAGE_TLS_DIRECTORY結(jié)構(gòu)體 463 45 6 5 編寫TLS回調(diào)函數(shù) 464 45 6 6 最終完成 464 45 7 小結(jié) 465 第46章 TEB 466 46 1 TEB 466 46 1 1 TEB結(jié)構(gòu)體的定義 466 46 1 2 TEB結(jié)構(gòu)體成員 466 46 1 3 重要成員 469 46 2 TEB訪問方法 470 46 2 1 Ntdll NtCurrentTeb() 470 46 2 2 FS段寄存器 471 46 3 小結(jié) 472 第47章 PEB 473 47 1 PEB 473 47 1 1 PEB訪問方法 473 47 1 2 PEB結(jié)構(gòu)體的定義 474 47 1 3 PEB結(jié)構(gòu)體的成員 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 小結(jié) 480 第48章 SEH 481 48 1 SEH 481 48 2 SEH練習(xí)示例 #1 481 48 2 1 正常運(yùn)行 481 48 2 2 調(diào)試運(yùn)行 482 48 3 OS的異常處理方法 484 48 3 1 正常運(yùn)行時(shí)的異常處理方法 484 48 3 2 調(diào)試運(yùn)行時(shí)的異常處理方法 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詳細(xì)說明 489 48 5 1 SEH鏈 489 48 5 2 異常處理函數(shù)的定義 489 48 5 3 TEB NtTib ExceptionList 491 48 5 4 SEH安裝方法 492 48 6 SEH練習(xí)示例 #2(seh exe) 492 48 6 1 查看SEH鏈 493 48 6 2 添加SEH 493 48 6 3 發(fā)生異常 494 48 6 4 查看異常處理器參數(shù) 494 48 6 5 調(diào)試異常處理器 496 48 6 6 刪除SEH 498 48 7 設(shè)置OllyDbg選項(xiàng) 499 48 7 1 忽略KERNEL32中發(fā)生的內(nèi)存非法訪問異常 500 48 7 2 向被調(diào)試者派送異常 500 48 7 3 其他異常處理 500 48 7 4 簡(jiǎn)單練習(xí) 500 48 8 小結(jié) 501 第49章 IA-32指令 502 49 1 IA-32指令 502 49 2 常用術(shù)語(yǔ) 502 49 2 1 反匯編器 503 49 2 2 反編譯器 504 49 2 3 反編譯簡(jiǎn)介 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 立即數(shù) 509 49 4 指令解析手冊(cè) 509 49 4 1 下載IA-32用戶手冊(cè) 509 49 4 2 打印指令解析手冊(cè) 509 49 5 指令解析練習(xí) 510 49 5 1 操作碼映射 510 49 5 2 操作數(shù) 511 49 5 3 ModR/M 512 49 5 4 Group 514 49 5 5 前綴 516 49 5 6 雙字節(jié)操作碼 518 49 5 7 移位值&立即數(shù) 519 49 5 8 SIB 520 49 6 指令解析課外練習(xí) 524 49 7 小結(jié) 524 第七部分 反調(diào)試技術(shù) 第50章 反調(diào)試技術(shù) 526 50 1 反調(diào)試技術(shù) 526 50 1 1 依賴性 526 50 1 2 多種反調(diào)試技術(shù) 526 50 2 反調(diào)試破解技術(shù) 526 50 3 反調(diào)試技術(shù)的分類 527 50 3 1 靜態(tài)反調(diào)試技術(shù) 528 50 3 2 動(dòng)態(tài)反調(diào)試技術(shù) 528 第51章 靜態(tài)反調(diào)試技術(shù) 529 51 1 靜態(tài)反調(diào)試的目的 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 練習(xí):?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 練習(xí):StaAD_NtQIP exe 540 51 3 5 破解之法 540 51 4 NtQuerySystemInformation() 542 51 4 1 SystemKernelDebugger-Information(0x23) 544 51 4 2 練習(xí):StaAD_NtQSI exe 545 51 4 3 破解之法 545 51 5 NtQueryObject() 545 51 6 ZwSetInformationThread() 549 51 6 1 練習(xí):StaAD_ZwSIT exe 549 51 6 2 破解之法 550 51 7 TLS回調(diào)函數(shù) 550 51 8 ETC 551 51 8 1 練習(xí):StaAD_FindWindow exe 551 51 8 2 破解之法 551 51 9 小結(jié) 553 第52章 動(dòng)態(tài)反調(diào)試技術(shù) 554 52 1 動(dòng)態(tài)反調(diào)試技術(shù)的目的 554 52 2 異常 554 52 2 1 SEH 554 52 2 2 SetUnhandledException-Filter() 558 52 3 Timing Check 562 52 3 1 時(shí)間間隔測(cè)量法 562 52 3 2 RDTSC 563 52 4 陷阱標(biāo)志 565 52 4 1 單步執(zhí)行 566 52 4 2 INT 2D 569 52 5 0xCC探測(cè) 572 52 5 1 API斷點(diǎn) 573 52 5 2 比較校驗(yàn)和 575 第53章 高級(jí)反調(diào)試技術(shù) 577 53 1 高級(jí)反調(diào)試技術(shù) 577 53 2 垃圾代碼 577 53 3 擾亂代碼對(duì)齊 578 53 4 加密/解密 581 53 4 1 簡(jiǎn)單的解碼示例 581 53 4 2 復(fù)雜的解碼示例 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 小結(jié) 595 第八部分 調(diào)試練習(xí) 第54章 調(diào)試練習(xí)1:服務(wù) 598 54 1 服務(wù)進(jìn)程的工作原理 598 54 1 1 服務(wù)控制器 598 54 1 2 服務(wù)啟動(dòng)過程 599 54 2 DebugMe1 exe示例講解 600 54 2 1 安裝服務(wù) 600 54 2 2 啟動(dòng)服務(wù) 602 54 2 3 源代碼 604 54 3 服務(wù)進(jìn)程的調(diào)試 606 54 3 1 問題在于SCM 606 54 3 2 調(diào)試器無所不能 606 54 3 3 常用方法 606 54 4 服務(wù)調(diào)試練習(xí) 606 54 4 1 直接調(diào)試:強(qiáng)制設(shè)置EIP 606 54 4 2 服務(wù)調(diào)試的常用方法:“附加”方式 609 54 5 小結(jié) 615 第55章 調(diào)試練習(xí)2:自我創(chuàng)建 616 55 1 自我創(chuàng)建 616 55 2 工作原理 617 55 2 1 創(chuàng)建子進(jìn)程(掛起模式) 617 55 2 2 更改EIP 618 55 2 3 恢復(fù)主線程 618 55 3 示例程序源代碼 618 55 4 調(diào)試練習(xí) 620 55 4 1 需要考慮的事項(xiàng) 620 55 4 2 JIT調(diào)試 621 55 4 3 DebugMe2 exe 622 55 5 小結(jié) 626 第56章 調(diào)試練習(xí)3:PE映像切換 627 56 1 PE映像 627 56 2 PE映像切換 628 56 3 示例程序:Fake exe、Real exe、DebugMe3 exe 628 56 4 調(diào)試1 631 56 4 1 Open? 輸入運(yùn)行參數(shù) 631 56 4 2 main()函數(shù) 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 調(diào)試2 644 56 5 1 思考 645 56 5 2 向EP設(shè)置無限循環(huán) 645 56 6 小結(jié) 647 第57章 調(diào)試練習(xí)4:Debug Blocker 648 57 1 Debug Blocker 648 57 2 反調(diào)試特征 648 57 2 1 父與子的關(guān)系 649 57 2 2 被調(diào)試進(jìn)程不能再被其他調(diào)試器調(diào)試 649 57 2 3 終止調(diào)試進(jìn)程的同時(shí)也終止被調(diào)試進(jìn)程 649 57 2 4 調(diào)試器操作被調(diào)試者的代碼 649 57 2 5 調(diào)試器處理被調(diào)試進(jìn)程中發(fā)生的異常 649 57 3 調(diào)試練習(xí):DebugMe4 exe 650 57 4 第一次調(diào)試 650 57 4 1 選定調(diào)試的起始位置 650 57 4 2 main() 650 57 5 第二次調(diào)試 651 57 6 第三次調(diào)試 653 57 7 第四次調(diào)試 656 57 8 第五次調(diào)試 658 57 8 1 系統(tǒng)斷點(diǎn) 658 57 8 2 EXCEPTION_ILLEGAL_INSTRUCTION(1) 659 57 8 3 EXCEPTION_ILLEGAL_INSTRUCTION(2) 660 57 9 第六次調(diào)試 661 57 9 1 40121D(第一個(gè)異常) 661 57 9 2 401299(第二個(gè)異常) 665 57 10 第七次調(diào)試 667 57 10 1 靜態(tài)方法 668 57 10 2 動(dòng)態(tài)方法 669 57 11 小結(jié) 673 結(jié)束語(yǔ) 674 索引 676
你還可能感興趣
我要評(píng)論
|