
安全技术大系:恶意代码分析实战
《安全技术大系:恶意代码分析实战》是2014年电子工业出版社出版的图书,作者是麦可·斯科尔斯基、安德鲁·哈尼克。
基本介绍
- 中文名:安全技术大系:恶意代码分析实战
- 外文名:Practical Malware Analysis the Hands-On Guide to Dissecting Malicious Software
- 出版社:电子工业出版社
- 页数:704页
- 开本:16
- 品牌:电子工业出版社
- 类型:计算机与网际网路
- 出版日期:2014年4月1日
- 语种:简体中文
- ISBN:7121224682
基本介绍
内容简介
不管你是否有恶意代码分析的背景和经验,《恶意代码分析实战》极其丰富的内容都将使你获益匪浅。
《恶意代码分析实战》教你如何、以及何时使用恶意代码分析技术,深入掌握恶意代码分析工具的核心功能,从而达到準确诊断、及时突破、快速回响的效果。
《恶意代码分析实战》一经问世,便赢来业内好评如潮,被业内人士一致推荐为入门、晋级的权威读本。
权威,详尽,经典——每一位认真学习过《恶意代码分析实战》的读者,必将在恶意代码分析的专业技能上获得巨大的提升。
《恶意代码分析实战》教你如何、以及何时使用恶意代码分析技术,深入掌握恶意代码分析工具的核心功能,从而达到準确诊断、及时突破、快速回响的效果。
《恶意代码分析实战》一经问世,便赢来业内好评如潮,被业内人士一致推荐为入门、晋级的权威读本。
权威,详尽,经典——每一位认真学习过《恶意代码分析实战》的读者,必将在恶意代码分析的专业技能上获得巨大的提升。
《恶意代码分析实战》是业内公认的迄今为止最权威的一本恶意代码分析指南,《恶意代码分析实战》也是每一位恶意代码分析师都必须作为指导手册珍藏的案头必备。《恶意代码分析实战》既是一本教材,也是一本动手实践的指南。不仅教会你如何分析恶意代码(技术指导),而且配了大量的实验练习、案例、答案以及详细的分析过程,同时还包含了所有用作案例的恶意代码样本,提供了丰富、安全的学习环境。针对初学者:本书的技术内容、实验作业可以帮你渐入佳境;针对中级读者:本书大量的分析实践会直接带你进入更高的级别,臻入化境。
作者简介
麦可·斯科尔斯基(Michael Sikorski)是在Mandiant公司任职的计算机安全顾问。他对恶意代码进行逆向分析,支持公司安全事件回响调查,并为公司的联邦政府部门客户提供专业研究与开发的安全解决方案。迈克创建了一套恶意代码分析的系列课程,并对不同的客群进行培训,包括联邦调查局和Black Hat黑客大会参会者。在加入Mandiant公司之前,他在麻省理工学院林肯实验室工作,在那里他对被动网路映射技术和渗透测试进行研究。迈克也是美国国家安全局为期三年的系统和网路跨学科研究生项目的毕业生。在美国国家安全局期间,他为逆向工程方面的研究做出了贡献,并获得在网路分析方面的多项发明奖项。
安德鲁·哈尼克(Andrew Honig)是美国国防部的一位信息保障专家。他在国家密码学院(National Cryptologic School)教授软体分析、逆向工程和Windows系统编程的课程,并是一位CISSP安全认证专家。安德鲁是VMware虚拟化产品几个零日漏洞的发现者,并开发了一些可以检测新型恶意代码(包括核心套件)的创新工具。作为一位精于恶意代码与良性软体分析技术的专家,他已经拥有超过10年的计算机安全业界分析师的经验。
安德鲁·哈尼克(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,哥伦比亚大学教授
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,哥伦比亚大学教授
图书目录
第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.5PE档案格式11
1.6程式库与函式12
1.6.1静态连结、运行时连结与动态连结12
1.6.2使用DependencyWalker工具探索动态连结函式13
1.6.3导入函式14
1.6.4导出函式15
1.7静态分析技术实践15
1.7.1PotentialKeylogger.exe:一个未加壳的执行档15
1.7.2PackedProgram.exe:穷途末路18
1.8PE档案头与分节18
1.8.1使用PEview来分析PE档案19
1.8.2使用ResourceHacker工具来查看资源节22
1.8.3使用其他的PE档案工具23
1.8.4PE档案头概述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使用进程浏览器(ProcessExplorer)来查看进程43
3.4.1进程浏览器的显示43
3.4.2使用验证选项44
3.4.3比较字元串45
3.4.4使用依赖遍历器(DependencyWalker)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.2逆向工程62
4.3x86体系结构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.11C语言主函式和偏移76
4.3.12更多信息:Intelx86ArchitectureManual77
4.4小结78
第5章IDAPro79
5.1载入一个执行档79
5.2IDAPro接口81
5.2.1反彙编视窗模式81
5.2.2对分析有用的视窗83
5.2.3返回到默认视图83
5.2.4导航IDAPro83
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用IDAPro图形化分析函式105
6.3.2识别嵌套的if语句106
6.4识别循环107
6.4.1找到for循环107
6.4.2找到while循环109
6.5理解函式调用约定110
6.5.1cdecl110
6.5.2stdcall111
6.5.3fastcall111
6.5.4压栈与移动111
6.6分析switch语句112
6.6.1If样式112
6.6.2跳转表114
6.7反彙编数组118
6.8识别结构体119
6.9分析鍊表遍历121
6.10小结123
6.11实验123
第7章分析恶意Windows程式126
7.1WindowsAPI126
7.1.1类型和匈牙利表达法126
7.1.2句柄127
7.1.3档案系统函式127
7.1.4特殊档案128
7.2Windows注册表129
7.2.1注册表根键130
7.2.2Regedit131
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.3WinINetAPI135
7.4跟蹤恶意代码的运行136
7.4.1DLL136
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原生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章OllyDbg165
9.1载入恶意代码165
9.1.1打开一个执行档165
9.1.2附加调试器到一个运行程式166
9.2OllyDbg的接口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载入DLL176
9.8跟蹤177
9.8.1标準回溯跟蹤177
9.8.2堆叠调用跟蹤178
9.8.3运行跟蹤178
9.8.4跟蹤PoisonIvy178
9.9异常处理179
9.10修补180
9.11分析shellcode181
9.12协助功能182
9.13外挂程式182
9.13.1OllyDump183
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.6Rootkit204
10.6.1Rootkit分析实践205
10.6.2中断208
10.7载入驱动209
10.8WindowsVista、Windows7和x64版本的核心问题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.1GINA拦截217
11.3.2口令哈希转储218
11.3.3击键记录221
11.4存活机制223
11.4.1Windows注册表223
11.4.2特洛伊木马化(Trojanized)系统二进制档案225
11.4.3DLL载入顺序劫持227
11.5提权228
11.5.1使用SeDebugPrivilege228
11.6隐藏它的蹤迹——用户态的Rootkit229
11.6.1IATHook230
11.6.2InlineHook231
11.7小结232
11.8实验232
第12章隐蔽的恶意代码启动234
12.1启动器(Launcher)234
12.2进程注入234
12.2.1DLL注入235
12.2.2直接注入237
12.3进程替换238
12.4钩子(Hook)注入240
12.4.1本地和远程钩子(Hook)240
12.4.2使用钩子的击键记录器241
12.4.3使用SetWindowsHookEx241
12.4.4目标执行绪241
12.5Detours242
12.6APC注入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.2XOR249
13.2.3其他一些简单的加密策略254
13.2.4Base64255
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.3OPSEC=操作安全性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用IDAPro对指令进行NOP替换311
15.4混淆控制流图312
15.4.1函式指针问题312
15.4.2在IDAPro中添加代码的交叉引用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使用WindowsAPI322
16.1.2手动检测数据结构324
16.1.3系统痕迹检测326
16.2识别调试器的行为327
16.2.1INT扫描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.1PE头漏洞334
16.4.2OutputDebugString漏洞336
16.5小结336
16.6实验336
第17章反虚拟机技术338
17.1VMware痕迹338
17.1.1绕过VMware痕迹的探测340
17.1.2探测记忆体痕迹342
17.2查找漏洞指令342
17.2.1使用RedPill反虚拟机技术343
17.2.2使用NoPill技术344
17.2.3查询I/O通信连线埠344
17.2.4使用str指令345
17.2.5反虚拟机的x86指令346
17.2.6在IDAPro中高亮显示反虚拟机代码347
17.2.7使用ScoopyNG347
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查找OEP359
18.5.3手动修复导入表363
18.6常见壳的技巧与窍门364
18.6.1UPX364
18.6.2PECompact365
18.6.3ASPack365
18.6.4Petite365
18.6.5WinUpack366
18.6.6Themida367
18.7不完全脱壳情况下的分析368
18.8加壳DLL368
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一个完整的HelloWorld例子383
19.6shellcode编码385
19.7空指令雪橇387
19.8找到shellcode387
19.9小结388
19.10实验389
第20章C++代码分析391
20.1面向对象的程式语言391
20.1.1this指针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.2x64架构上的差别404
21.2.1x64调用约定和栈使用上的差别406
21.2.264位异常处理408
21.3在Windows64位上的Windows32位408
21.4恶意代码功能上的64位提示409
21.5小结410
21.6实验410
附录A常见Windows函式列表412
附录B流行的恶意代码分析工具列表424
附录C实验作业参考解答435
附录D致青春,基础软体开发的中国故事691
附录ESyser操作入门695
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.5PE档案格式11
1.6程式库与函式12
1.6.1静态连结、运行时连结与动态连结12
1.6.2使用DependencyWalker工具探索动态连结函式13
1.6.3导入函式14
1.6.4导出函式15
1.7静态分析技术实践15
1.7.1PotentialKeylogger.exe:一个未加壳的执行档15
1.7.2PackedProgram.exe:穷途末路18
1.8PE档案头与分节18
1.8.1使用PEview来分析PE档案19
1.8.2使用ResourceHacker工具来查看资源节22
1.8.3使用其他的PE档案工具23
1.8.4PE档案头概述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使用进程浏览器(ProcessExplorer)来查看进程43
3.4.1进程浏览器的显示43
3.4.2使用验证选项44
3.4.3比较字元串45
3.4.4使用依赖遍历器(DependencyWalker)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.2逆向工程62
4.3x86体系结构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.11C语言主函式和偏移76
4.3.12更多信息:Intelx86ArchitectureManual77
4.4小结78
第5章IDAPro79
5.1载入一个执行档79
5.2IDAPro接口81
5.2.1反彙编视窗模式81
5.2.2对分析有用的视窗83
5.2.3返回到默认视图83
5.2.4导航IDAPro83
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用IDAPro图形化分析函式105
6.3.2识别嵌套的if语句106
6.4识别循环107
6.4.1找到for循环107
6.4.2找到while循环109
6.5理解函式调用约定110
6.5.1cdecl110
6.5.2stdcall111
6.5.3fastcall111
6.5.4压栈与移动111
6.6分析switch语句112
6.6.1If样式112
6.6.2跳转表114
6.7反彙编数组118
6.8识别结构体119
6.9分析鍊表遍历121
6.10小结123
6.11实验123
第7章分析恶意Windows程式126
7.1WindowsAPI126
7.1.1类型和匈牙利表达法126
7.1.2句柄127
7.1.3档案系统函式127
7.1.4特殊档案128
7.2Windows注册表129
7.2.1注册表根键130
7.2.2Regedit131
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.3WinINetAPI135
7.4跟蹤恶意代码的运行136
7.4.1DLL136
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原生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章OllyDbg165
9.1载入恶意代码165
9.1.1打开一个执行档165
9.1.2附加调试器到一个运行程式166
9.2OllyDbg的接口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载入DLL176
9.8跟蹤177
9.8.1标準回溯跟蹤177
9.8.2堆叠调用跟蹤178
9.8.3运行跟蹤178
9.8.4跟蹤PoisonIvy178
9.9异常处理179
9.10修补180
9.11分析shellcode181
9.12协助功能182
9.13外挂程式182
9.13.1OllyDump183
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.6Rootkit204
10.6.1Rootkit分析实践205
10.6.2中断208
10.7载入驱动209
10.8WindowsVista、Windows7和x64版本的核心问题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.1GINA拦截217
11.3.2口令哈希转储218
11.3.3击键记录221
11.4存活机制223
11.4.1Windows注册表223
11.4.2特洛伊木马化(Trojanized)系统二进制档案225
11.4.3DLL载入顺序劫持227
11.5提权228
11.5.1使用SeDebugPrivilege228
11.6隐藏它的蹤迹——用户态的Rootkit229
11.6.1IATHook230
11.6.2InlineHook231
11.7小结232
11.8实验232
第12章隐蔽的恶意代码启动234
12.1启动器(Launcher)234
12.2进程注入234
12.2.1DLL注入235
12.2.2直接注入237
12.3进程替换238
12.4钩子(Hook)注入240
12.4.1本地和远程钩子(Hook)240
12.4.2使用钩子的击键记录器241
12.4.3使用SetWindowsHookEx241
12.4.4目标执行绪241
12.5Detours242
12.6APC注入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.2XOR249
13.2.3其他一些简单的加密策略254
13.2.4Base64255
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.3OPSEC=操作安全性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用IDAPro对指令进行NOP替换311
15.4混淆控制流图312
15.4.1函式指针问题312
15.4.2在IDAPro中添加代码的交叉引用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使用WindowsAPI322
16.1.2手动检测数据结构324
16.1.3系统痕迹检测326
16.2识别调试器的行为327
16.2.1INT扫描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.1PE头漏洞334
16.4.2OutputDebugString漏洞336
16.5小结336
16.6实验336
第17章反虚拟机技术338
17.1VMware痕迹338
17.1.1绕过VMware痕迹的探测340
17.1.2探测记忆体痕迹342
17.2查找漏洞指令342
17.2.1使用RedPill反虚拟机技术343
17.2.2使用NoPill技术344
17.2.3查询I/O通信连线埠344
17.2.4使用str指令345
17.2.5反虚拟机的x86指令346
17.2.6在IDAPro中高亮显示反虚拟机代码347
17.2.7使用ScoopyNG347
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查找OEP359
18.5.3手动修复导入表363
18.6常见壳的技巧与窍门364
18.6.1UPX364
18.6.2PECompact365
18.6.3ASPack365
18.6.4Petite365
18.6.5WinUpack366
18.6.6Themida367
18.7不完全脱壳情况下的分析368
18.8加壳DLL368
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一个完整的HelloWorld例子383
19.6shellcode编码385
19.7空指令雪橇387
19.8找到shellcode387
19.9小结388
19.10实验389
第20章C++代码分析391
20.1面向对象的程式语言391
20.1.1this指针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.2x64架构上的差别404
21.2.1x64调用约定和栈使用上的差别406
21.2.264位异常处理408
21.3在Windows64位上的Windows32位408
21.4恶意代码功能上的64位提示409
21.5小结410
21.6实验410
附录A常见Windows函式列表412
附录B流行的恶意代码分析工具列表424
附录C实验作业参考解答435
附录D致青春,基础软体开发的中国故事691
附录ESyser操作入门695
序言
电话铃声急促响起,网路管理员告诉你说公司网站被黑了,网站上的客户敏感信息被盗了。于是你立马开始调查分析,首先检查了日誌记录,来确定事件涉及的主机。你用防毒软体对这些主机进行了扫描,检查是否感染了恶意代码。你的运气还算不错,防毒软体检测到一个木马程式,名为TROJ.snapAK。你删除这个档案,并清理了现场,同时你还部署了一个入侵检测系统,来确认没有其他主机被感染。最后你修补了一个你认为是被攻击者利用来入侵主机的安全漏洞,来确保这种攻击事件不会再次发生。
不幸的是,几天之后网路管理员再次打电话过来,告诉你说敏感信息又被窃取了。这看起来似乎是相同的攻击,但你却不知道该做什幺。很显然,你部署的入侵检测系统特徵库失效了。因为更多的主机被感染了,而你的防毒软体并没有提供足够的保护来隔离攻击威胁。现在,公司高层管理人员要求你解释发生了什幺,而你可以告诉他们的只是一个名为TROJ.snapAK的恶意代码。你没有针对最重要问题的答案,这让他们认为你是一位不称职的安全工程师。
你该如何确定TROJ.snapAK恶意代码在做什幺,从而可以让你消除这个威胁?你如何才能写出一个更有效的网路检测特徵?你怎样才能找出其他感染了这个恶意代码的主机呢?你该如何确保你删除了整个恶意代码程式包,而不只是其中的一部分呢?你该如何回答管理层关于这个恶意代码干了些什幺的问题呢?
如果你所有能做的,只是告诉你的老闆,说你需要聘请昂贵的外部谘询顾问,因为你不能保护自己的网路,这真的不是确保工作饭碗的好办法。
幸运的是,你有着足够的智慧,马上啃起了这本《恶意代码分析实战》,从这本书中你将学到的技能,可以教你如何来回答这些困难的问题,并为你展示保护网路免受恶意代码侵害的方法。
什幺是恶意代码分析
恶意代码,也称为恶意软体,在大多数计算机入侵事件中都扮演了重要角色。任何以某种方式来对用户、计算机或网路造成破坏的软体,都可以被认为是恶意代码,包括计算机病毒、木马、蠕虫、核心套件、勒索软体、间谍软体,等等。儘管各种不同的恶意代码类型会做一些完全不同的事情(你将会在本书中看到),作为恶意代码分析师,我们拥有一组核心的工具和技术,用来解剖分析各式各样的恶意代码。
恶意代码分析是一种解剖恶意代码的艺术,了解恶意代码是如何工作的、如何识别它,以及如何战胜或消除它。你并不是需要成为一名超级黑客,才能进行恶意代码分析。
网路上每天有着数以百万计,甚至更多的恶意代码,恶意代码分析成为了任何一位从事计算机安全事件回响安全工程师的必需技能。此外,由于恶意代码分析专业人才的短缺,熟练的恶意代码分析师正处于强烈的人才需求之中。
这幺说吧,这不是一本关于如何找到恶意代码的书籍。我们的重点是在如何分析已经找到的恶意代码。我们专注于Windows作业系统上发现的恶意代码——因为到目前为止,Windows作业系统还是最为常用的作业系统。但你所学到的技能可以为你在任何作业系统上分析恶意代码提供支持。我们还将专注在执行档上,因为它们是最常见的,也是你所遇到的最难以分析的一些档案。与此同时,我们选择不讨论如恶意JavaScript脚本、Java程式等其他类型的恶意代码,相反的是,我们选择对方法进行深入讨论,用于分析更加高级的威胁,比如后门、隐蔽性恶意代码和核心套件。
先决条件
不管你是否有恶意代码分析的背景或经验,你都会从本书中受益。
第1~3章将讨论基础的恶意代码分析技术,即使你没有安全或编程经验,也可以用这些技术来进行恶意代码分析。第4~14章则覆盖中等级别的内容,可以让你武装上一些用来分析大多数恶意程式的主流工具与技能。这些章节都需要一些关于程式语言的基本知识。第15~19章,则提供最先进的技术材料,即使对资深的恶意代码分析师来说都是有用的,因为这部分内容涵盖了恶意代码分析的一些战术和技巧,在分析最为複杂的恶意代码样本时都用得上,比如那些套用了对抗反彙编、反调试技术或加壳技术的恶意代码。
本书将教你如何以及何时使用各种恶意代码分析技术。了解何时应该使用特定的技术与掌握技术本身一样重要,因为在某个特定状况下使用了错误的技术,可能会是在令人沮丧地浪费时间。我们不会涵盖每一个工具,因为工具会随时改变,而它的核心功能才是最重要的。此外,我们将在整本书中使用切合实际的恶意代码样本。
实践动手学习
我们有着逆向工程和恶意代码分析专业课程的丰富教学经验,这些经验已经告诉我们,学生只有通过使用所学习的技能进行动手实践练习时,才能真正掌握和学到这些技能。我们也发现了实验作业的质量与讲授的课程内容同等重要,如果没有一个实验作业部分,要学会如何分析恶意代码是几乎不可能的。
从始至终,本书中绝大多数章节最后都会给出一些实验作业,让你来练习这一章中所讲授的技术。这些实验作业为你提供了真实恶意代码样本的挑战,旨在展示你将在真实世界中遭遇到恶意代码中最为普遍的类型和行为。这些实验作业旨在加强每章中所介绍的基本概念,而不会用一些无关信息来让你无所适从。每个实验都包括一个或多个恶意档案,以及一些特意设计来引导你完成实验的问题,此外也给出了对这些问题的简短答案,以及对恶意代码样本的详细分析过程。
这些实验都模拟了真实的恶意代码分析场景。比如,它们都以通用化的档案名称字进行命名,而不会提供任何能够洞察到恶意代码功能的信息。对于真正环境中的恶意代码,你也同样在开始分析时不会有任何信息,而你需要用你所学到的技能,来收集线索,并找出恶意代码在做些什幺。
每个实验所需的时间将取决于你的经验。你可以尝试自己来完成实验,或者沿着详细分析过程,来了解如何在实践中使用各种技术。
大多数章节都包含了三个实验作业。第一个实验通常是最简单的,绝大多数读者都应该能够完成它。第二个实验是中等难度的,大多数读者会需要解答中的一些援助来完成。而第三个实验是最困难的,如果没有从参考答案取得提示,只有最勤奋和技术大拿的读者们才能够完成它们。
本书内容预览
《恶意代码分析实战》以使用简单的方法,从相对而言不那幺複杂的恶意代码中获取信息开始,然后逐步提升难度,讲解可以用来对抗最为先进恶意程式的複杂技术。以下是本书每章的内容预览:
第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核心调试器的入门指南。
我们整本书的目标就是为你武装能够击败各种类型恶意代码的分析技术。正如你看到的,我们涵盖了大量的技术材料,以及能够加强这些技术材料的实验作业。当你读完本书时,应该学到了用来分析任何恶意代码的技能,包括快速分析常规恶意代码样本的基础技术,以及解剖那些甚至是“来自外星”的神秘恶意代码样本所需的高超技术。
那幺,让我们开始吧!
不幸的是,几天之后网路管理员再次打电话过来,告诉你说敏感信息又被窃取了。这看起来似乎是相同的攻击,但你却不知道该做什幺。很显然,你部署的入侵检测系统特徵库失效了。因为更多的主机被感染了,而你的防毒软体并没有提供足够的保护来隔离攻击威胁。现在,公司高层管理人员要求你解释发生了什幺,而你可以告诉他们的只是一个名为TROJ.snapAK的恶意代码。你没有针对最重要问题的答案,这让他们认为你是一位不称职的安全工程师。
你该如何确定TROJ.snapAK恶意代码在做什幺,从而可以让你消除这个威胁?你如何才能写出一个更有效的网路检测特徵?你怎样才能找出其他感染了这个恶意代码的主机呢?你该如何确保你删除了整个恶意代码程式包,而不只是其中的一部分呢?你该如何回答管理层关于这个恶意代码干了些什幺的问题呢?
如果你所有能做的,只是告诉你的老闆,说你需要聘请昂贵的外部谘询顾问,因为你不能保护自己的网路,这真的不是确保工作饭碗的好办法。
幸运的是,你有着足够的智慧,马上啃起了这本《恶意代码分析实战》,从这本书中你将学到的技能,可以教你如何来回答这些困难的问题,并为你展示保护网路免受恶意代码侵害的方法。
什幺是恶意代码分析
恶意代码,也称为恶意软体,在大多数计算机入侵事件中都扮演了重要角色。任何以某种方式来对用户、计算机或网路造成破坏的软体,都可以被认为是恶意代码,包括计算机病毒、木马、蠕虫、核心套件、勒索软体、间谍软体,等等。儘管各种不同的恶意代码类型会做一些完全不同的事情(你将会在本书中看到),作为恶意代码分析师,我们拥有一组核心的工具和技术,用来解剖分析各式各样的恶意代码。
恶意代码分析是一种解剖恶意代码的艺术,了解恶意代码是如何工作的、如何识别它,以及如何战胜或消除它。你并不是需要成为一名超级黑客,才能进行恶意代码分析。
网路上每天有着数以百万计,甚至更多的恶意代码,恶意代码分析成为了任何一位从事计算机安全事件回响安全工程师的必需技能。此外,由于恶意代码分析专业人才的短缺,熟练的恶意代码分析师正处于强烈的人才需求之中。
这幺说吧,这不是一本关于如何找到恶意代码的书籍。我们的重点是在如何分析已经找到的恶意代码。我们专注于Windows作业系统上发现的恶意代码——因为到目前为止,Windows作业系统还是最为常用的作业系统。但你所学到的技能可以为你在任何作业系统上分析恶意代码提供支持。我们还将专注在执行档上,因为它们是最常见的,也是你所遇到的最难以分析的一些档案。与此同时,我们选择不讨论如恶意JavaScript脚本、Java程式等其他类型的恶意代码,相反的是,我们选择对方法进行深入讨论,用于分析更加高级的威胁,比如后门、隐蔽性恶意代码和核心套件。
先决条件
不管你是否有恶意代码分析的背景或经验,你都会从本书中受益。
第1~3章将讨论基础的恶意代码分析技术,即使你没有安全或编程经验,也可以用这些技术来进行恶意代码分析。第4~14章则覆盖中等级别的内容,可以让你武装上一些用来分析大多数恶意程式的主流工具与技能。这些章节都需要一些关于程式语言的基本知识。第15~19章,则提供最先进的技术材料,即使对资深的恶意代码分析师来说都是有用的,因为这部分内容涵盖了恶意代码分析的一些战术和技巧,在分析最为複杂的恶意代码样本时都用得上,比如那些套用了对抗反彙编、反调试技术或加壳技术的恶意代码。
本书将教你如何以及何时使用各种恶意代码分析技术。了解何时应该使用特定的技术与掌握技术本身一样重要,因为在某个特定状况下使用了错误的技术,可能会是在令人沮丧地浪费时间。我们不会涵盖每一个工具,因为工具会随时改变,而它的核心功能才是最重要的。此外,我们将在整本书中使用切合实际的恶意代码样本。
实践动手学习
我们有着逆向工程和恶意代码分析专业课程的丰富教学经验,这些经验已经告诉我们,学生只有通过使用所学习的技能进行动手实践练习时,才能真正掌握和学到这些技能。我们也发现了实验作业的质量与讲授的课程内容同等重要,如果没有一个实验作业部分,要学会如何分析恶意代码是几乎不可能的。
从始至终,本书中绝大多数章节最后都会给出一些实验作业,让你来练习这一章中所讲授的技术。这些实验作业为你提供了真实恶意代码样本的挑战,旨在展示你将在真实世界中遭遇到恶意代码中最为普遍的类型和行为。这些实验作业旨在加强每章中所介绍的基本概念,而不会用一些无关信息来让你无所适从。每个实验都包括一个或多个恶意档案,以及一些特意设计来引导你完成实验的问题,此外也给出了对这些问题的简短答案,以及对恶意代码样本的详细分析过程。
这些实验都模拟了真实的恶意代码分析场景。比如,它们都以通用化的档案名称字进行命名,而不会提供任何能够洞察到恶意代码功能的信息。对于真正环境中的恶意代码,你也同样在开始分析时不会有任何信息,而你需要用你所学到的技能,来收集线索,并找出恶意代码在做些什幺。
每个实验所需的时间将取决于你的经验。你可以尝试自己来完成实验,或者沿着详细分析过程,来了解如何在实践中使用各种技术。
大多数章节都包含了三个实验作业。第一个实验通常是最简单的,绝大多数读者都应该能够完成它。第二个实验是中等难度的,大多数读者会需要解答中的一些援助来完成。而第三个实验是最困难的,如果没有从参考答案取得提示,只有最勤奋和技术大拿的读者们才能够完成它们。
本书内容预览
《恶意代码分析实战》以使用简单的方法,从相对而言不那幺複杂的恶意代码中获取信息开始,然后逐步提升难度,讲解可以用来对抗最为先进恶意程式的複杂技术。以下是本书每章的内容预览:
第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核心调试器的入门指南。
我们整本书的目标就是为你武装能够击败各种类型恶意代码的分析技术。正如你看到的,我们涵盖了大量的技术材料,以及能够加强这些技术材料的实验作业。当你读完本书时,应该学到了用来分析任何恶意代码的技能,包括快速分析常规恶意代码样本的基础技术,以及解剖那些甚至是“来自外星”的神秘恶意代码样本所需的高超技术。
那幺,让我们开始吧!