安全技術大系程序員
惡意代碼分析實戰(最權威的惡意代碼分析指南,理論實踐分析並重,業內人手一冊的寶典)算法
【美】Michael Sikorski(邁克爾.斯科爾斯基), Andrew Honig(安德魯.哈尼克)著 shell
諸葛建偉 姜輝 張光凱 譯編程
ISBN 978-7-121-22468-3數組
2014年4月出版瀏覽器
訂價:128.00元 安全
732頁服務器
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 配置VMware 29
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 使用ApateDNS 47
3.6.2 使用Netcat進行監視 48
3.7 使用Wireshark進行數據包監聽 49
3.8 使用INetSim 51
3.9 基礎動態分析工具實踐 52
3.10 小結 55
3.11 實驗 56
第 2篇 靜態分析高級技術篇
第4章 x86反彙編速成班 60
4.1 抽象層次 60
4.2 逆向工程 62
4.3 x86體系結構 62
4.3.1 內存 63
4.3.2 指令 64
4.3.3 操做碼和字節序 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 Manual 77
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 用插件擴展IDA 95
5.7.1 使用IDC腳本 96
5.7.2 使用IDAPython 97
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 cdecl 110
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 Windows API 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 Regedit 131
7.2.3 自啓動程序 131
7.2.4 經常使用註冊表函數 131
7.2.5 練習分析註冊表操做代碼 132
7.2.6 使用.reg文件的註冊表腳本 133
7.3 網絡API 133
7.3.1 伯克利兼容套接字 134
7.3.2 網絡的服務器和客戶端 134
7.3.3 WinINet API 135
7.4 跟蹤惡意代碼的運行 136
7.4.1 DLL 136
7.4.2 進程 137
7.4.3 線程 139
7.4.4 使用互斥量的進程間協做 142
7.4.5 服務 143
7.4.6 組件對象模型 145
7.4.7 異常:當事情出錯時 147
7.5 內核與用戶模式 148
7.6 原生API 149
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 內存映射 168
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 加載DLL 176
9.8 跟蹤 177
9.8.1 標準回溯跟蹤 177
9.8.2 堆棧調用跟蹤 178
9.8.3 運行跟蹤 178
9.8.4 跟蹤Poison Ivy 178
9.9 異常處理 179
9.10 修補 180
9.11 分析shellcode 181
9.12 協助功能 182
9.13 插件 182
9.13.1 OllyDump 183
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 使用WinDbg 193
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 Rootkit 204
10.6.1 Rootkit分析實踐 205
10.6.2 中斷 208
10.7 加載驅動 209
10.8 Windows Vista、Windows 7 和x64版本的內核問題 209
10.9 小結 210
10.10 實驗 210
第 4篇 惡意代碼功能篇
第11章 惡意代碼行爲 214
11.1 下載器和啓動器 214
11.2 後門(backdoor) 214
11.2.1 反向shell 215
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 使用SeDebugPrivilege 228
11.6 隱藏它的蹤影——用戶態的Rootkit 229
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 XOR 249
13.2.3 其餘一些簡單的加密策略 254
13.2.4 Base64 255
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 API 322
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 使用ScoopyNG 347
17.3 調整設置 348
17.4 虛擬機逃逸 349
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 查找OEP 359
18.5.3 手動修復導入表 363
18.6 常見殼的技巧與竅門 364
18.6.1 UPX 364
18.6.2 PECompact 365
18.6.3 ASPack 365
18.6.4 Petite 365
18.6.5 WinUpack 366
18.6.6 Themida 367
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.dll 378
19.4.2 解析PE文件導出數據 380
19.4.3 使用散列過的導出符號名 382
19.5 一個完整的Hello World例子 383
19.6 shellcode編碼 385
19.7 空指令雪橇 387
19.8 找到shellcode 387
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
做者簡介
邁克爾·斯科爾斯基(Michael Sikorski)是在Mandiant公司任職的計算機安全顧問。他對惡意代碼進行逆向分析,支持公司安全事件響應調查,併爲公司的聯邦政府部門客戶提供專業研究與開發的安全解決方案。邁克建立了一套惡意代碼分析的系列課程,並對不一樣的受衆進行培訓,包括聯邦調查局和Black Hat黑客大會參會者。在加入Mandiant公司以前,他在麻省理工學院林肯實驗室工做,在那裏他對被動網絡映射技術和滲透測試進行研究。邁克也是美國國家安全局爲期三年的系統和網絡跨學科研究生項目的畢業生。在美國國家安全局期間,他爲逆向工程方面的研究作出了貢獻,並得到在網絡分析方面的多項發明獎項。
安德魯·哈尼克(Andrew Honig)是美國國防部的一位信息保障專家。他在國家密碼學院(National Cryptologic School)教授軟件分析、逆向工程和Windows系統編程的課程,並是一位CISSP安全認證專家。安德魯是VMware虛擬化產品幾個零日漏洞的發現者,並開發了一些能夠檢測新型惡意代碼(包括內核套件)的創新工具。做爲一位精於惡意代碼與良性軟件分析技術的專家,他已經擁有超過10年的計算機安全業界分析師的經驗。
媒體評論
一本優秀的惡意代碼速成教程。
Dino Dai Zovi,自由安全諮詢師
一本最爲全面的惡意代碼分析技術指南,覆蓋了全部惡意代碼分析所需的關鍵技術,幫助你理解最新惡意代碼帶來的技術挑戰。
Chris Eagle,美國海軍研究生院,計算機科學系高級講師
一本惡意代碼分析的實踐入門指南,我把這本書推薦給全部但願解剖Windows惡意代碼的讀者。
— Ilfak Guilfanov,IDA PRO創始人
一本惡意代碼分析的優秀指南,全部章節都包含有詳細的技術解釋和動手實踐案例教程,讓你可以當即面對真實的惡意代碼。
— Sebastian Porst,Google軟件工程師
本書爲各個技術層次上的讀者帶來逆向工程方法,提供了一大堆覆蓋各類技術而且容易訪問的實踐案例,將帶領你更加深刻地理解逆向工程的藝術與科學。我強烈推薦本書,不管是新手仍是領域專家。
— Danny Quist,博士,OFFENSIVE COMPUTING創始人
若是你只要讀一本惡意代碼的書籍,或是但願進入到惡意代碼分析師的世界,就來看這本書吧!
— Patrick Engbretson,達科他州立大學教授,The Basics of Hacking and Pen Testing一書的做者
爲軟件安全或入侵檢測系統等研究生級別高級課程提供很好的課程資料,實踐案例對學生學習逆向工程方法、惡意代碼分析和理解等方面具備特殊的價值。
— Sal Stolfo,哥倫比亞大學教授
前言
電話鈴聲急促響起,網絡管理員告訴你說公司網站被黑了,網站上的客戶敏感信息被盜了。因而你立馬開始調查分析,首先檢查了日誌記錄,來肯定事件涉及的主機。你用殺毒軟件對這些主機進行了掃描,檢查是否感染了惡意代碼。你的運氣還算不錯,殺毒軟件檢測到一個木馬程序,名爲TROJ.snapAK。你刪除這個文件,並清理了現場,同時你還部署了一個入侵檢測系統,來確認沒有其餘主機被感染。最後你修補了一個你認爲是被攻擊者利用來入侵主機的安全漏洞,來確保這種攻擊事件不會再次發生。
不幸的是,幾天以後網絡管理員再次打電話過來,告訴你說敏感信息又被竊取了。這看起來彷佛是相同的攻擊,但你殊不知道該作什麼。很顯然,你部署的入侵檢測系統特徵庫失效了。由於更多的主機被感染了,而你的殺毒軟件並無提供足夠的保護來隔離攻擊威脅。如今,公司高層管理人員要求你解釋發生了什麼,而你能夠告訴他們的只是一個名爲TROJ.snapAK的惡意代碼。你沒有針對最重要問題的答案,這讓他們認爲你是一位不稱職的安全工程師。
你該如何肯定TROJ.snapAK惡意代碼在作什麼,從而可讓你消除這個威脅?你如何才能寫出一個更有效的網絡檢測特徵?你怎樣才能找出其餘感染了這個惡意代碼的主機呢?你該如何確保你刪除了整個惡意代碼程序包,而不僅是其中的一部分呢?你該如何回答管理層關於這個惡意代碼幹了些什麼的問題呢?
若是你全部能作的,只是告訴你的老闆,說你須要聘請昂貴的外部諮詢顧問,由於你不能保護本身的網絡,這真的不是確保工做飯碗的好辦法。
幸運的是,你有着足夠的智慧,立刻啃起了這本《惡意代碼分析實戰》,從這本書中你將學到的技能,能夠教你如何來回答這些困難的問題,併爲你展現保護網絡免受惡意代碼侵害的方法。
什麼是惡意代碼分析
惡意代碼,也稱爲惡意軟件,在大多數計算機入侵事件中都扮演了重要角色。任何以某種方式來對用戶、計算機或網絡形成破壞的軟件,均可以被認爲是惡意代碼,包括計算機病毒、木馬、蠕蟲、內核套件、勒索軟件、間諜軟件,等等。儘管各類不一樣的惡意代碼類型會作一些徹底不一樣的事情(你將會在本書中看到),做爲惡意代碼分析師,咱們擁有一組核心的工具和技術,用來解剖分析各式各樣的惡意代碼。
惡意代碼分析是一種解剖惡意代碼的藝術,瞭解惡意代碼是如何工做的、如何識別它,以及如何打敗或消除它。你並非須要成爲一名超級黑客,才能進行惡意代碼分析。
網絡上天天有着數以百萬計,甚至更多的惡意代碼,惡意代碼分析成爲了任何一位從事計算機安全事件響應安全工程師的必需技能。此外,因爲惡意代碼分析專業人才的短缺,熟練的惡意代碼分析師正處於強烈的人才需求之中。
這麼說吧,這不是一本關於如何找到惡意代碼的書籍。咱們的重點是在如何分析已經找到的惡意代碼。咱們專一於Windows操做系統上發現的惡意代碼——由於到目前爲止,Windows操做系統仍是最爲經常使用的操做系統。但你所學到的技能能夠爲你在任何操做系統上分析惡意代碼提供支持。咱們還將專一在可執行文件上,由於它們是最多見的,也是你所遇到的最難以分析的一些文件。與此同時,咱們選擇不討論如惡意JavaScript腳本、Java程序等其餘類型的惡意代碼,相反的是,咱們選擇對方法進行深刻討論,用於分析更加高級的威脅,好比後門、隱蔽性惡意代碼和內核套件。
先決條件
無論你是否有惡意代碼分析的背景或經驗,你都會從本書中受益。
第1~3章將討論基礎的惡意代碼分析技術,即便你沒有安全或編程經驗,也能夠用這些技術來進行惡意代碼分析。第4~14章則覆蓋中等級別的內容,可讓你武裝上一些用來分析大多數惡意程序的主流工具與技能。這些章節都須要一些關於編程語言的基本知識。第15~19章,則提供最早進的技術材料,即便對資深的惡意代碼分析師來講都是有用的,由於這部份內容涵蓋了惡意代碼分析的一些戰術和技巧,在分析最爲複雜的惡意代碼樣本時都用得上,好比那些應用了對抗反彙編、反調試技術或加殼技術的惡意代碼。
本書將教你如何以及什麼時候使用各類惡意代碼分析技術。瞭解什麼時候應該使用特定的技術與掌握技術自己同樣重要,由於在某個特定情況下使用了錯誤的技術,可能會是在使人沮喪地浪費時間。咱們不會涵蓋每個工具,由於工具會隨時改變,而它的核心功能纔是最重要的。此外,咱們將在整本書中使用切合實際的惡意代碼樣本(你能夠從http://www.practicalmalwareanalysis.com/或http://www.nostarch. com/malware.htm下載),來爲你揭示在分析真實世界中惡意代碼時會遇到的各類情況。
實踐動手學習
咱們有着逆向工程和惡意代碼分析專業課程的豐富教學經驗,這些經驗已經告訴咱們,學生只有經過使用所學習的技能進行動手實踐練習時,才能真正掌握和學到這些技能。咱們也發現了實驗做業的質量與講授的課程內容同等重要,若是沒有一個實驗做業部分,要學會如何分析惡意代碼是幾乎不可能的。
從始至終,本書中絕大多數章節最後都會給出一些實驗做業,讓你來練習這一章中所講授的技術。這些實驗做業爲你提供了真實惡意代碼樣本的挑戰,旨在展現你將在真實世界中遭遇到惡意代碼中最爲廣泛的類型和行爲。這些實驗做業旨在增強每章中所介紹的基本概念,而不會用一些無關信息來讓你無所適從。每一個實驗都包括一個或多個惡意文件(能夠從http://www.practicalmalware analysis.com/,或者http://www.nostarch.com/malware.htm下載),以及一些特地設計來引導你完成實驗的問題,此外也給出了對這些問題的簡短答案,以及對惡意代碼樣本的詳細分析過程。
這些實驗都模擬了真實的惡意代碼分析場景。好比,它們都以通用化的文件名字進行命名,而不會提供任何可以洞察到惡意代碼功能的信息。對於真正環境中的惡意代碼,你也一樣在開始分析時不會有任何信息,而你須要用你所學到的技能,來收集線索,並找出惡意代碼在作些什麼。
每一個實驗所需的時間將取決於你的經驗。你能夠嘗試本身來完成實驗,或者沿着詳細分析過程,來了解如何在實踐中使用各類技術。
大多數章節都包含了三個實驗做業。第一個實驗一般是最簡單的,絕大多數讀者都應該可以完成它。第二個實驗是中等難度的,大多數讀者會須要解答中的一些援助來完成。而第三個實驗是最困難的,若是沒有從參考答案取得提示,只有最勤奮和技術大拿的讀者們纔可以完成它們。
本書內容預覽
《惡意代碼分析實戰》以使用簡單的方法,從相對而言不那麼複雜的惡意代碼中獲取信息開始,而後逐步提高難度,講解能夠用來對抗最爲先進惡意程序的複雜技術。如下是本書每章的內容預覽:
第0章,「惡意代碼分析技術入門」,創建起惡意代碼分析的總體過程和基礎方法學。
第1章,「靜態分析基礎技術」,傳授無須執行就能從可執行文件獲取信息的方法。
第2章,「在虛擬機中分析惡意代碼」,帶你一塊兒設置虛擬機,用做運行惡意代碼的安全環境。
第3章,「動態分析基礎技術」,介紹一些經過執行惡意程序進行分析、易於使用但很是高效的技術方法。
第4章,「x86反彙編速成班」,是對x86彙編語言的一個簡要介紹,這章爲使用IDA Pro進行惡意代碼深刻分析提供了基礎。
第5章,「IDA Pro」,爲你顯示如何使用IDA Pro,一個最爲重要的惡意代碼分析工具。咱們將在全書的其他章節使用IDA Pro工具。
第6章,「識別彙編中的C代碼結構」,提供了一些C語言代碼的彙編語句案例,並教你如何理解彙編代碼的高層功能結構。
第7章,「分析惡意Windows程序」,覆蓋範圍普遍的Windows程序特定概念,而這些是理解惡意Windows程序所必需的。
第8章,「動態調試」,解釋調試的基本知識,以及惡意代碼分析師該如何使用調試器。
第9章,「OllyDbg」,爲你展現如何使用OllyDbg,惡意代碼分析師中最流行的一款調試器。
第10章,「使用WinDbg調試內核」,包括瞭如何使用WinDbg來分析內核模式惡意代碼和內核套件。
第11章,「惡意代碼行爲」,介紹了常見的惡意代碼功能,並告訴你在分析惡意代碼時該如何識別惡意功能。
第12章,「隱蔽的惡意代碼啓動」,討論如何分析一類將本身的執行隱藏至另外一進程中的特殊惡意代碼。
第13章,「數據加密」,演示了惡意代碼如何加密數據,使其更難在網絡流量或受害主機上被發現。
第14章,「惡意代碼的網絡特徵」,教你如何經過惡意代碼分析來建立網絡檢測特徵,並演示這類特徵要優於單獨從捕獲網絡流量中提取的特徵。
第15章,「對抗反彙編」,解釋一些惡意代碼編寫者如何設計本身的惡意代碼,使得它們難以被反彙編,並說明如何識別和擊敗這些技術。
第16章,「反調試技術」,描述惡意代碼編寫者可讓他們的代碼難以被調試的伎倆,以及克服這些障礙的方法。
第17章,「反虛擬機技術」,演示惡意代碼所使用的反虛擬機技術,這些技術會讓分析師在虛擬機中難以分析這些惡意代碼,並介紹繞過這些技術的方法。
第18章,「加殼與脫殼」,告訴讀者惡意代碼是如何使用加殼來隱藏本身真正目的的,而後提供一步一步的脫殼的技術方法。
第19章,「shellcode分析」,解釋了shellcode是什麼,並展現分析惡意shellcode的一些技巧和竅門。
第20章,「C++代碼分析」,爲你指明C++代碼在編譯以後存在什麼樣的差別,並教授你如何對由C++編寫的惡意代碼進行分析。
第21章,「64位惡意代碼」,討論惡意代碼編寫者爲什麼使用64位惡意代碼,以及你所須要瞭解的x86與x64之間的區別。
附錄A,「常見Windows函數列表」,簡要介紹了惡意代碼中廣泛使用的Windows函數。
附錄B,「流行的惡意代碼分析工具列表」,列出了對於惡意代碼分析師們來講最有用的工具。
附錄C,「實驗做業參考解答」,對全書每一個章節的實驗給出了參考解答。
附錄D,「致青春,基礎軟件開發的中國故事」,講述中國程序員開發Windows內核調試器Syser的幕後故事。
附錄E,「Syser操做入門」,提供Syser內核調試器的入門指南。
咱們整本書的目標就是爲你武裝可以擊敗各類類型惡意代碼的分析技術。正如你看到的,咱們涵蓋了大量的技術材料,以及可以增強這些技術材料的實驗做業。當你讀完本書時,應該學到了用來分析任何惡意代碼的技能,包括快速分析常規惡意代碼樣本的基礎技術,以及解剖那些甚至是「來自外星」的神祕惡意代碼樣本所需的高超技術。
那麼,讓咱們開始吧!