內容簡介
本書是一本內容全面的
惡意代碼分析技術指南,其內容兼顧理論,重在實踐,從不同方面為讀者講解惡意代碼分析的實用技術方法。
本書分為21章,覆蓋惡意代碼行為、惡意代碼靜態分析方法、惡意代碼動態分析方法、惡意代碼對抗與反對抗方法等,並包含了
shellcode分析,
C++惡意代碼分析,以及
64位惡意代碼分析方法的介紹。本書多個章節後面都配有實驗並配有實驗的詳細講解與分析。通過每章的介紹及章後的實驗,本書一步一個台階地幫助初學者從零開始建立起惡意代碼分析的基本技能。
本書獲得業界的一致好評,
IDA Pro的作者Ilfak Guilfanov這樣評價本書:“一本惡意代碼分析的實踐入門指南,我把這本書推薦給所有希望解剖
Windows惡意代碼的讀者”。
圖書目錄
第0章 惡意代碼分析技術入門1
0.1 惡意代碼分析目標1
0.2 惡意代碼分析技術2
0.2.1 靜態分析基礎技術2
0.2.2 動態分析基礎技術2
0.2.3 靜態分析高級技術2
0.2.4 動態分析高級技術2
0.4 惡意代碼分析通用規則4
第 1 篇 靜態分析
第1章 靜態分析基礎技術 6
1.1 反病毒引擎掃描:實用的第一步6
1.4 加殼與混淆惡意代碼9
1.5 PE 檔案格式11
1.6 程式庫與函式12
1.6.2 使用Dependency Walker 工具探索動態連結函式13
1.6.3 導入函式14
1.6.4 導出函式15
1.7 靜態分析技術實踐15
1.7.1 PotentialKeylogger.exe:一個未加殼的
執行檔15
1.7.2 PackedProgram.exe:窮途末路18
1.8 PE 檔案頭與分節18
1.8.1 使用PEview 來分析PE 檔案19
1.8.3 使用其他的PE 檔案工具23
1.8.4 PE 檔案頭概述23
1.9 小結24
1.10 實驗24
第2章 在虛擬機中分析惡意代碼 27
2.2 創建惡意代碼分析機28
2.2.2 斷開網路30
2.2.3 創建主機模式網路30
2.2.4 使用多個虛擬機30
2.3 使用惡意代碼分析機31
2.3.1 讓惡意代碼連線網際網路31
2.3.3 拍攝快照32
2.3.4 從虛擬機傳輸檔案33
2.4 使用VMware 進行惡意代碼分析的風險34
2.5 記錄/重放:重複計算機運行軌跡34
2.6 小結35
第3章 動態分析基礎技術 36
3.1.1 使用惡意代碼沙箱36
3.1.2 沙箱的缺點37
3.2 運行惡意代碼38
3.3 進程監視器39
3.3.1 進程監視器的顯示40
3.3.2 進程監視器中的過濾41
3.4.1 進程瀏覽器的顯示43
3.4.2 使用驗證選項44
3.4.3 比較字元串45
3.4.4 使用依賴
遍歷器(Dependency Walker)45
3.4.5 分析惡意文檔46
3.6 模擬網路47
3.6.1 使用ApateDNS47
3.8 使用INetSim51
3.9 基礎動態分析工具實踐52
3.10 小結55
3.11 實驗56
第 2 篇 靜態分析高級技術篇
4.1 抽象層次60
4.3.1 記憶體63
4.3.2 指令64
4.3.6 簡單指令67
4.3.8 條件指令73
4.3.9 分支指令73
4.3.10 重複指令74
4.3.12 更多信息:Intel x86 Architecture Manual77
4.4 小結78
5.1 載入一個執行檔79
5.2 IDA Pro 接口81
5.2.1 反彙編視窗模式81
5.2.2 對分析有用的視窗83
5.2.3 返回到默認視圖83
5.2.4 導航IDA Pro 83
5.2.5 搜尋85
5.3 使用交叉引用86
5.3.1 代碼交叉引用87
5.3.2 數據交叉引用88
5.4 分析函式88
5.5 使用圖形選項89
5.6 增強反彙編91
5.6.1 重命名位置91
5.6.2 注釋92
5.6.3 格式化運算元92
5.6.4 使用命名的常量93
5.6.5 重新定義代碼和數據94
5.7 用外掛程式擴展IDA95
5.7.1 使用IDC 腳本96
5.7.2 使用IDAPython97
5.7.3 使用商業外掛程式97
5.8 小結98
5.9 實驗98
第6章 識別彙編中的C代碼結構 100
6.2 反彙編算術操作102
6.3.1 用IDA Pro 圖形化分析函式105
6.3.2 識別嵌套的if 語句106
6.4 識別循環107
6.4.2 找到while 循環109
6.5.1 cdecl110
6.5.2 stdcall 111
6.5.3 fastcall 111
6.5.4 壓棧與移動 111
6.6.1 If 樣式112
6.6.2 跳轉表114
6.9 分析鍊表遍歷121
6.10 小結123
6.11 實驗123
7.1.1 類型和匈牙利表達法126
7.1.3 檔案系統函式127
7.1.4 特殊檔案128
7.2 Windows 註冊表129
7.2.3 自啟動程式131
7.2.4 常用註冊表函式131
7.2.5 練習分析註冊表操作代碼132
7.2.6 使用.reg 檔案的註冊表腳本133
7.3.2 網路的伺服器和客戶端134
7.4 跟蹤惡意代碼的運行136
7.4.1 DLL136
7.4.2 進程137
7.4.5 服務143
7.4.7 異常:當事情出錯時147
7.5 核心與用戶模式148
7.6 原生API149
7.7 小結151
7.8 實驗151
第 3 篇 動態分析高級技術篇
8.3 使用調試器155
8.3.2 單步跳過(Stepping-Over)和單步跳入(Stepping-Into)156
8.4 異常161
8.4.1 首次和二次異常處理162
8.4.2 常見異常162
8.5 使用調試器修改執行檔163
8.6 修改可執行程式的實踐163
8.7 小結164
9.1 載入惡意代碼165
9.1.1 打開一個執行檔165
9.1.2 附加調試器到一個運行程式166
9.2 OllyDbg 的接口167
9.3.1 基地址重定位169
9.5 執行代碼171
9.6 斷點172
9.6.1 軟體斷點173
9.6.2 條件斷點174
9.6.3 硬體斷點175
9.6.4 記憶體斷點175
9.7 載入DLL176
9.8 跟蹤177
9.8.1 標準回溯跟蹤177
9.8.2 堆疊調用跟蹤178
9.8.3 運行跟蹤178
9.8.4 跟蹤Poison Ivy178
9.9 異常處理179
9.10 修補180
9.12 協助功能182
9.13 外掛程式182
9.13.1 OllyDump183
9.13.2 調試器隱藏外掛程式183
9.13.4 書籤185
9.15 小結186
9.16 實驗187
10.1 驅動與核心代碼189
10.2 安裝核心調試191
10.3 使用WinDbg193
10.3.1 從記憶體中讀取194
10.3.2 使用算術操作符194
10.3.3 設定斷點194
10.3.4 列舉模組195
10.4 微軟符號表195
10.4.1 搜尋符號195
10.4.2 查看結構信息196
10.5 核心調試實踐198
10.5.1 用戶空間的代碼198
10.5.2 核心模式的代碼200
10.5.3 查找驅動對象203
10.6.1 Rootkit 分析實踐205
10.6.2 中斷208
10.7 載入驅動209
10.9 小結210
10.10 實驗210
第 4 篇 惡意代碼功能篇
第11章 惡意代碼行為 214
11.1 下載器和啟動器214
11.2.2 遠程控制工具216
11.2.4 遠程控制工具與殭屍網路的比較217
11.3 登錄憑證竊密器217
11.3.1 GINA 攔截217
11.3.2 口令哈希轉儲218
11.3.3 擊鍵記錄221
11.4 存活機制223
11.4.1 Windows 註冊表223
11.4.2
特洛伊木馬化(Trojanized)系統二進制檔案225
11.4.3 DLL 載入順序劫持227
11.5.1 使用SeDebugPrivilege228
11.6 隱藏它的蹤跡——用戶態的Rootkit229
11.6.1 IAT Hook 230
11.6.2 Inline Hook 231
11.7 小結232
11.8 實驗232
第12章 隱蔽的惡意代碼啟動 234
12.2 進程注入234
12.2.1 DLL 注入235
12.2.2 直接注入237
12.3 進程替換238
12.4.1 本地和遠程鉤子(Hook)240
12.4.2 使用鉤子的擊鍵記錄器241
12.4.4 目標執行緒241
12.6 APC 注入243
12.6.1 用戶模式下APC 注入244
12.6.2 核心模式的APC 注入245
12.7 小結246
12.8 實驗246
13.1 分析加密算法的目的248
13.2.2 XOR249
13.2.3 其他一些簡單的加密策略254
13.3 常見的加密算法258
13.3.1 識別字元串和導入259
13.3.2 查找加密常量259
13.3.3 查找高熵值內容261
13.4 自定義加密262
13.4.1 識別自定義加密263
13.4.2 攻擊者使用自定義加密的優勢265
13.5 解密265
13.5.1 自解密265
13.5.2 手動執行解密函式266
13.5.3 使用通用的解密規範267
13.6 小結270
13.7 實驗271
第14章 惡意代碼的網路特徵273
14.1 網路應對措施273
14.1.1 在原始環境中觀察惡意代碼273
14.1.2 惡意行為的痕跡274
14.2 安全地調查線上攻擊者275
14.2.1 間接性策略275
14.3 基於內容的網路應對措施278
14.3.2 深入觀察279
14.4 結合動態和靜態分析技術282
14.4.1 過度分析的危險283
14.4.3 理解周邊代碼286
14.4.4 尋找網路操作代碼287
14.4.5 了解網路內容的來源288
14.4.6 硬編碼數據 vs. 臨時數據289
14.4.7 確定和利用編碼步驟289
14.4.8 創建特徵291
14.4.10 針對多個元素294
14.5 了解攻擊者的意圖295
14.6 小結296
14.7 實驗296
第 5 篇 逆向工程
第15章 對抗反彙編 300
15.1 何謂對抗反彙編技術300
15.2 挫敗反彙編算法301
15.2.1 線性反彙編302
15.2.2 面向代碼流的反彙編303
15.3 對抗反彙編技術306
15.3.1 相同目標的跳轉指令306
15.3.3 無效的反彙編指令308
15.3.4 用IDA Pro 對指令進行NOP替換311
15.4.2 在IDA Pro 中添加代碼的交叉引用313
15.4.3 濫用返回指針313
15.5 挫敗棧幀分析317
15.6 小結320
15.7 實驗320
第16章 反調試技術322
16.1 探測Windows 調試器322
16.1.1 使用Windows API322
16.1.2 手動檢測數據結構324
16.1.3 系統痕跡檢測326
16.2 識別調試器的行為327
16.2.1 INT 掃描327
16.2.2 執行代碼校驗和檢查328
16.2.3 時鐘檢測328
16.3 干擾調試器的功能330
16.3.2 使用異常332
16.3.3 插入中斷333
16.4 調試器漏洞334
16.5 小結336
16.6 實驗336
第17章 反虛擬機技術 338
17.1 VMware 痕跡338
17.1.1 繞過VMware 痕跡的探測340
17.1.2 探測記憶體痕跡342
17.2 查找漏洞指令342
17.2.1 使用Red Pill 反虛擬機技術343
17.2.2 使用No Pill 技術344
17.2.4 使用str 指令345
17.2.5 反虛擬機的x86 指令346
17.2.6 在IDA Pro 中高亮顯示反虛擬機代碼347
17.2.7 使用ScoopyNG347
17.3 調整設定348
17.5 小結349
17.6 實驗349
18.1 剖析加殼352
18.1.1 脫殼存根353
18.1.2 載入執行檔353
18.1.3 解析導入函式表353
18.1.4 尾部跳轉354
18.1.5 圖示脫殼過程354
18.2 識別加殼程式355
18.2.1 加殼程式的標識355
18.2.2 熵計算356
18.3 脫殼選項356
18.4 自動脫殼356
18.5 手動脫殼357
18.5.1 使用導入重構器重構導入表358
18.5.3 手動修復導入表363
18.6 常見殼的技巧與竅門364
18.6.4 Petite 365
18.6.5 WinUpack 366
18.7 不完全脫殼情況下的分析368
18.8 加殼DLL 368
18.9 小結369
18.10 實驗369
第 6 篇 高級專題
19.1 載入shellcode 進行分析372
19.2 位置無關代碼373
19.3 識別執行位置373
19.3.1 使用call/pop 指令374
19.3.2 使用fnstenv 指令376
19.4 手動符號解析377
19.4.2 解析PE 檔案導出數據380
19.4.3 使用散列過的導出符號名382
19.6 shellcode 編碼385
19.7 空指令雪橇387
19.8 找到shellcode387
19.9 小結388
19.10 實驗389
20.1 面向對象的程式語言391
20.1.1 this 指針392
20.2.2 識別虛函式表399
20.3 創建和銷毀對象400
20.4 小結401
20.5 實驗401
第21章 64位惡意代碼 403
21.1 為什麼需要64 位惡意代碼403
21.2 x64架構上的差別404
21.2.1 x64 調用約定和棧使用上的差別406
21.2.2 64 位異常處理408
21.3 在Windows 64 位上的Windows 32 位408
21.4 惡意代碼功能上的64位提示409
21.5 小結410
21.6 實驗410
附錄B 流行的惡意代碼分析工具列表424
附錄C 實驗作業參考解答435
附錄D 致青春,基礎軟體開發的中國故事 691
附錄E Syser 操作入門 695