第1章 通過逆嚮工程學習如何讀懂二進製代碼 1
1.1 先來實際體驗一下軟件分析吧 3
1.1.1 通過Process Monitor的日誌來確認程序的行為 4
1.1.2 從注冊錶訪問中能發現些什麼 6
1.1.3 什麼是逆嚮工程 9
專欄:逆嚮工程技術大賽 10
1.2 嘗試靜態分析 11
1.2.1 靜態分析與動態分析 11
專欄:Stirling與BZ Editor的區彆 12
1.2.2 用二進製編輯器查看文件內容 13
1.2.3 看不懂匯編語言也可以進行分析 14
1.2.4 在沒有源代碼的情況下搞清楚程序的行為 16
1.2.5 確認程序的源代碼 18
1.3 嘗試動態分析 20
1.3.1 設置Process Monitor的過濾規則 20
1.3.2 調試器是乾什麼用的 23
1.3.3 用OllyDbg洞察程序的詳細邏輯 24
1.3.4 對反匯編代碼進行分析 26
專欄:什麼是寄存器 28
1.3.5 將分析結果與源代碼進行比較 29
專欄:選擇自己喜歡的調試器 30
1.4 學習最基礎的匯編指令 32
1.4.1 沒必要記住所有的匯編指令 32
1.4.2 匯編語言是如何實現條件分支的 33
1.4.3 參數存放在棧中 35
1.4.4 從匯編代碼聯想到C語言源代碼 37
1.5 通過匯編指令洞察程序行為 40
1.5.1 給函數設置斷點 40
1.5.2 反匯編並觀察重要邏輯 42
專欄:學習編寫匯編代碼 47
第2章 在射擊遊戲中防止玩傢作弊 51
2.1 解讀內存轉儲 53
2.1.1 射擊遊戲的規則 53
2.1.2 修改4個字節就能得高分 54
2.1.3 獲取內存轉儲 58
2.1.4 從進程異常終止瞬間的狀態查找崩潰的原因 63
2.1.5 有效運用實時調試 66
2.1.6 通過轉儲文件尋找齣錯原因 68
專欄:除瞭個人電腦,在其他計算機設備上運行的程序也可以進行
分析嗎 74
專欄:分析Java編寫的應用程序 74
2.2 如何防止軟件被彆人分析 76
2.2.1 反調試技術 76
專欄:檢測調試器的各種方法 77
2.2.2 通過代碼混淆來防止分析 79
專欄:代碼混淆的相關話題 80
2.2.3 將可執行文件進行壓縮 81
2.2.4 將壓縮過的可執行文件解壓縮:解包 86
2.2.5 通過手動解包UPX來理解其工作原理 87
2.2.6 用硬件斷點對ASPack進行解包 91
專欄:如何分析.NET編寫的應用程序 95
第3章 利用軟件的漏洞進行攻擊 97
3.1 利用緩衝區溢齣來執行任意代碼 99
3.1.1 引發緩衝區溢齣的示例程序 99
3.1.2 讓普通用戶用管理員權限運行程序 100
3.1.3 權限是如何被奪取的 102
3.1.4 棧是如何使用內存空間的 104
3.1.5 攻擊者如何執行任意代碼 107
3.1.6 用gdb 查看程序運行時的情況 110
3.1.7 攻擊代碼示例 113
3.1.8 生成可用作shellcode的機器語言代碼 116
3.1.9 對0x00的改進 121
專欄:printf類函數的字符串格式化bug 125
3.2 防禦攻擊的技術 127
3.2.1 地址隨機化:ASLR 127
3.2.2 除存放可執行代碼的內存空間以外,對其餘內存空間盡量
禁用執行權限:Exec-Shield 130
3.2.3 在編譯時插入檢測棧數據完整性的代碼:StackGuard 131
3.3 繞開安全機製的技術 134
3.3.1 使用libc中的函數來進行攻擊:Return-into-libc 134
3.3.2 利用未隨機化的模塊內部的匯編代碼進行攻擊:ROP 136
專欄:計算機安全為什麼會變成貓鼠遊戲 137
第4章 自由控製程序運行方式的編程技巧 139
4.1 通過自製調試器來理解其原理 141
4.1.1 親手做一個簡單的調試器,在實踐中學習 141
4.1.2 調試器到底是怎樣工作的 141
4.1.3 實現反匯編功能 147
4.1.4 運行改良版調試器 153
4.2 在其他進程中運行任意代碼:代碼注入 155
4.2.1 嚮其他進程注入代碼 155
4.2.2 用SetWindowsHookEx劫持係統消息 155
4.2.3 將DLL路徑配置到注冊錶的AppInit_DLLs項 162
4.2.4 通過CreateRemoteThread在其他進程中創建綫程 165
4.2.5 注入函數 170
4.3 任意替換程序邏輯:API 鈎子 174
4.3.1 API 鈎子的兩種類型 174
4.3.2 用Detours實現一個簡單的API 鈎子 174
4.3.3 修改消息框的標題欄 177
專欄:DLL注入和API鈎子是“黑客”技術的代錶? 178
第5章 使用工具探索更廣闊的世界 179
5.1 用Metasploit Framework驗證和調查漏洞 181
5.1.1 什麼是Metasploit Framework 181
5.1.2 安全漏洞的信息從何而來 181
5.1.3 搭建用於測試漏洞的環境 182
5.1.4 利用漏洞進行攻擊 183
專欄:深入探索shellcode 184
5.1.5 一個ROP的實際例子 188
5.2 用EMET觀察反ROP的機製 192
5.2.1 什麼是EMET 192
5.2.2 Anti-ROP的設計獲得瞭藍帽奬 192
5.2.3 如何防止攻擊 193
5.2.4 搞清楚加載器的邏輯 194
5.2.5 DLL的程序邏輯 196
5.2.6 CALL-RETN檢查 197
5.2.7 如何防止誤判 200
5.2.8 檢查棧的閤法性 201
5.3 用REMnux 分析惡意軟件 205
5.3.1 什麼是REMnux 205
5.3.2 更新特徵數據庫 206
5.3.3 掃描目錄 206
5.4 用ClamAV檢測惡意軟件和漏洞攻擊 208
5.4.1 ClamAV的特徵文件 208
5.4.2 解壓縮.cvd文件 209
5.4.3 被檢測到的文件詳細信息 210
5.4.4 檢測所使用的打包器以及疑似惡意軟件的文件 211
5.5 用Zero Wine Tryouts分析惡意軟件 212
5.5.1 REMnux與Zero Wine Tryouts的區彆 212
5.5.2 運行機製 212
5.5.3 顯示用戶界麵 213
5.5.4 確認分析報告 214
專欄:嘗試開發自己的工具 217
5.6 盡量減少人工分析:啓發式技術 218
5.6.1 惡意軟件應對極限的到來:平均每天60000個 218
5.6.2 啓發式技術革命 218
5.6.3 用兩個惡意軟件進行測試 220
附錄 223
A.1 安裝IDA 224
A.2 安裝OllyDbg 229
A.3 安裝WinDbg 230
A.4 安裝Visual Studio 2010 235
A.5 安裝Metasploit 240
A.6 分析工具 248
Stirling / BZ Editor 248
Process Monitor 249
Process Explorer 250
Sysinternals工具 250
兔耳鏇風 251
參考文獻 252
後記 254
· · · · · · (
收起)