惡意代碼分析實戰

惡意代碼分析實戰

《惡意代碼分析實戰》是2014年4月電子工業出版社出版的圖書,作者是Michael Sikorski、Andrew Honig,譯者是諸葛建偉、姜輝、張光凱。

基本介紹

  • 中文名:《惡意代碼分析實戰》
  • 作者:Michael Sikorski  、Andrew Honig 
  • 譯者諸葛建偉 、姜輝 、張光凱 
  • 語言:Chinese 漢語 
  • 出版時間:2014年4月 
  • 出版社電子工業出版社 
  • 出版地:北京 
  • 頁數:732 頁 
  • 字數:1134千字 
  • ISBN:9787121224683 
  • 類別計算機科學
  • 定價:128 元 
  • 開本:16 開 
內容簡介,圖書目錄,

內容簡介

本書是一本內容全面的惡意代碼分析技術指南,其內容兼顧理論,重在實踐,從不同方面為讀者講解惡意代碼分析的實用技術方法。
本書分為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.3 惡意代碼類型3
0.4 惡意代碼分析通用規則4
第 1 篇 靜態分析
第1章 靜態分析基礎技術 6
1.1 反病毒引擎掃描:實用的第一步6
1.2 哈希值:惡意代碼的指紋7
1.3 查找字元串7
1.4 加殼與混淆惡意代碼9
1.4.1 檔案加殼10
1.4.2 使用PEiD 檢測加殼10
1.5 PE 檔案格式11
1.6 程式庫與函式12
1.6.1 靜態連結、運行時連結與動態連結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.2 使用Resource Hacker 工具來查看資源節22
1.8.3 使用其他的PE 檔案工具23
1.8.4 PE 檔案頭概述23
1.9 小結24
1.10 實驗24
第2章 在虛擬機中分析惡意代碼 27
2.1 虛擬機的結構27
2.2 創建惡意代碼分析機28
2.2.1 配置VMware29
2.2.2 斷開網路30
2.2.3 創建主機模式網路30
2.2.4 使用多個虛擬機30
2.3 使用惡意代碼分析機31
2.3.1 讓惡意代碼連線網際網路31
2.3.2 連線和斷開外圍設備32
2.3.3 拍攝快照32
2.3.4 從虛擬機傳輸檔案33
2.4 使用VMware 進行惡意代碼分析的風險34
2.5 記錄/重放:重複計算機運行軌跡34
2.6 小結35
第3章 動態分析基礎技術 36
3.1 沙箱:簡便但粗糙的方法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 使用進程瀏覽器(Process Explorer)來查看進程43
3.4.1 進程瀏覽器的顯示43
3.4.2 使用驗證選項44
3.4.3 比較字元串45
3.4.4 使用依賴遍歷器(Dependency Walker)45
3.4.5 分析惡意文檔46
3.5 使用Regshot 來比較註冊表快照46
3.6 模擬網路47
3.6.1 使用ApateDNS47
3.6.2 使用Netcat 進行監視48
3.7 使用Wireshark 進行數據包監聽49
3.8 使用INetSim51
3.9 基礎動態分析工具實踐52
3.10 小結55
3.11 實驗56
第 2 篇 靜態分析高級技術篇
第4章 x86 反彙編速成班 60
4.1 抽象層次60
4.3.1 記憶體63
4.3.2 指令64
4.3.4 運算元65
4.3.5 暫存器65
4.3.6 簡單指令67
4.3.7 70
4.3.8 條件指令73
4.3.9 分支指令73
4.3.10 重複指令74
4.3.11 C語言主函式和偏移76
4.3.12 更多信息:Intel x86 Architecture Manual77
4.4 小結78
第5章 IDA Pro 79
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.1 全局與局部變數101
6.2 反彙編算術操作102
6.3 識別if語句104
6.3.1 用IDA Pro 圖形化分析函式105
6.3.2 識別嵌套的if 語句106
6.4 識別循環107
6.4.1 找到for循環107
6.4.2 找到while 循環109
6.5 理解函式調用約定110
6.5.1 cdecl110
6.5.2 stdcall 111
6.5.3 fastcall 111
6.5.4 壓棧與移動 111
6.6 分析switch 語句112
6.6.1 If 樣式112
6.6.2 跳轉表114
6.7 反彙編數組118
6.8 識別結構體119
6.9 分析鍊表遍歷121
6.10 小結123
6.11 實驗123
第7章 分析惡意Windows程式 126
7.1.1 類型和匈牙利表達法126
7.1.2 句柄127
7.1.3 檔案系統函式127
7.1.4 特殊檔案128
7.2 Windows 註冊表129
7.2.1 註冊表根鍵130
7.2.2 Regedit131
7.2.3 自啟動程式131
7.2.4 常用註冊表函式131
7.2.5 練習分析註冊表操作代碼132
7.2.6 使用.reg 檔案的註冊表腳本133
7.3 網路API133
7.3.1 伯克利兼容套接字134
7.3.2 網路的伺服器和客戶端134
7.3.3 WinINet API 135
7.4 跟蹤惡意代碼的運行136
7.4.1 DLL136
7.4.2 進程137
7.4.3 執行緒139
7.4.4 使用互斥量的進程間協作142
7.4.5 服務143
7.4.7 異常:當事情出錯時147
7.5 核心與用戶模式148
7.6 原生API149
7.7 小結151
7.8 實驗151
第 3 篇 動態分析高級技術篇
第8章 動態調試 154
8.1 原始碼級與彙編級的調試器154
8.2 核心模式與用戶模式調試155
8.3 使用調試器155
8.3.1 單步調試155
8.3.2 單步跳過(Stepping-Over)和單步跳入(Stepping-Into)156
8.3.3 用斷點暫停執行157
8.4 異常161
8.4.1 首次和二次異常處理162
8.4.2 常見異常162
8.5 使用調試器修改執行檔163
8.6 修改可執行程式的實踐163
8.7 小結164
第9 章 OllyDbg 165
9.1 載入惡意代碼165
9.1.1 打開一個執行檔165
9.1.2 附加調試器到一個運行程式166
9.2 OllyDbg 的接口167
9.3.1 基地址重定位169
9.4 查看執行緒和堆疊170
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.11 分析shellcode181
9.12 協助功能182
9.13 外掛程式182
9.13.1 OllyDump183
9.13.2 調試器隱藏外掛程式183
9.13.3 命令行184
9.13.4 書籤185
9.14 腳本調試185
9.15 小結186
9.16 實驗187
第10章 使用WinDbg 調試核心 189
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.4.3 配置Windows 符號表198
10.5 核心調試實踐198
10.5.1 用戶空間的代碼198
10.5.2 核心模式的代碼200
10.5.3 查找驅動對象203
10.6 Rootkit204
10.6.1 Rootkit 分析實踐205
10.6.2 中斷208
10.7 載入驅動209
10.8 Windows VistaWindows 7x64 版本的核心問題209
10.9 小結210
10.10 實驗210
第 4 篇 惡意代碼功能篇
第11章 惡意代碼行為 214
11.1 下載器和啟動器214
11.2 後門(backdoor)214
11.2.1 反向shell215
11.2.2 遠程控制工具216
11.2.3 殭屍網路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 提權228
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.1 啟動器(Launcher)234
12.2 進程注入234
12.2.1 DLL 注入235
12.2.2 直接注入237
12.3 進程替換238
12.4 鉤子(Hook)注入240
12.4.1 本地和遠程鉤子(Hook)240
12.4.2 使用鉤子的擊鍵記錄器241
12.4.3 使用SetWindowsHookEx 241
12.4.4 目標執行緒241
12.5 Detours 242
12.6 APC 注入243
12.6.1 用戶模式下APC 注入244
12.6.2 核心模式的APC 注入245
12.7 小結246
12.8 實驗246
第13章 數據加密 248
13.1 分析加密算法的目的248
13.2 簡單的加密算法248
13.2.1 凱撒密碼249
13.2.2 XOR249
13.2.3 其他一些簡單的加密策略254
13.2.4 Base64255
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.1.3 OPSEC=操作安全性275
14.2 安全地調查線上攻擊者275
14.2.1 間接性策略275
14.2.2 獲取IP位址域名信息276
14.3 基於內容的網路應對措施278
14.3.1 使用Snort 進行入侵檢測278
14.3.2 深入觀察279
14.4 結合動態和靜態分析技術282
14.4.1 過度分析的危險283
14.4.2 在眾目睽睽下隱藏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.9 分析解析例程292
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.2 固定條件的跳轉指令307
15.3.3 無效的反彙編指令308
15.3.4 用IDA Pro 對指令進行NOP替換311
15.4 混淆控制流圖312
15.4.1 函式指針問題312
15.4.2 在IDA Pro 中添加代碼的交叉引用313
15.4.3 濫用返回指針313
15.4.4 濫用結構化異常處理315
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.1 使用TLS回調330
16.3.2 使用異常332
16.3.3 插入中斷333
16.4 調試器漏洞334
16.4.1 PE頭漏洞334
16.4.2 OutputDebugString漏洞336
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.3 查詢I/O 通信連線埠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章 加殼與脫殼 352
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.2 查找OEP359
18.5.3 手動修復導入表363
18.6 常見殼的技巧與竅門364
18.6.1 UPX 364
18.6.2 PECompact 365
18.6.3 ASPack365
18.6.4 Petite 365
18.6.5 WinUpack 366
18.6.6 Themida367
18.7 不完全脫殼情況下的分析368
18.8 加殼DLL 368
18.9 小結369
18.10 實驗369
第 6 篇 高級專題
第19章 shellcode 分析 372
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.1 在記憶體中找到kernel32.dll378
19.4.2 解析PE 檔案導出數據380
19.4.3 使用散列過的導出符號名382
19.5 一個完整的Hello World 例子383
19.6 shellcode 編碼385
19.7 空指令雪橇387
19.8 找到shellcode387
19.9 小結388
19.10 實驗389
第20章 C++代碼分析 391
20.1 面向對象的程式語言391
20.1.1 this 指針392
20.1.2 重載與修飾394
20.1.3 繼承(Inheritance)和函式重寫(Overriding)395
20.2 虛函式和非虛函式396
20.2.1 虛函式表的使用398
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
附錄A 常見Windows 函式列表 412
附錄B 流行的惡意代碼分析工具列表424
附錄C 實驗作業參考解答435
附錄D 致青春,基礎軟體開發的中國故事 691
附錄E Syser 操作入門 695

相關詞條

熱門詞條

聯絡我們