译者序 1
作者介绍 1
前言 1
致谢 1
第一部分 攻击者的策略 1
第1章 引言:自然的游戏 1
1.1 自我复制结构的早期模型 1
1.1.1 约翰·冯·诺伊曼:自我复制自动机理论 2
1.1.2 Fredkin:重建结构 3
1.1.3 Conway:生命游戏 4
1.1.4 磁芯大战:程序对战 6
1.2 计算机病毒的起源 10
1.3 自动复制代码:计算机病毒的原理和定义 11
参考文献 13
第2章 恶意代码分析的魅力 14
2.1 计算机病毒研究的通用模式 16
2.2 反病毒防护技术的发展 16
2.3 恶意程序的相关术语 17
2.3.1 病毒 17
2.3.2 蠕虫 17
2.3.3 逻辑炸弹 18
2.3.4 特洛伊木马 19
2.3.5 细菌 20
2.3.6 漏洞利用 20
2.3.7 下载器 20
2.3.8 拨号器 20
2.3.9 投放器 20
2.3.10 注入程序 21
2.3.11 auto-rooter 21
2.3.12 工具包(病毒生成器) 21
2.3.13 垃圾邮件发送程序 21
2.3.14 洪泛攻击 22
2.3.15 击键记录器 22
2.3.16 rootkit 22
2.4 其他类别 23
2.4.1 玩笑程序 23
2.4.2 恶作剧:连锁电子邮件 23
2.4.3 其他有害程序:广告软件和间谍软件 24
2.5 计算机恶意软件的命名规则 24
2.5.1 <family_name> 25
2.5.2 <malware_type>:// 25
2.5.3 <platform>/ 25
2.5.4 <group_name> 26
2.5.5 <infective_length> 26
2.5.6 <variant> 26
2.5.7 [<devolution>] 26
2.5.8 <modifiers> 26
2.5.9 :<locale_specifier> 26
2.5.10 #<packer> 26
2.5.11 @m或@mm 26
2.5.12 !<vendor-specific_comment> 26
2.6 公认的平台名称清单 27
参考文献 29
第3章 恶意代码环境 31
3.1 计算机体系结构依赖性 32
3.2 CPU依赖性 33
3.3 操作系统依赖性 34
3.4 操作系统版本依赖性 34
3.5 文件系统依赖性 35
3.5.1 簇病毒 35
3.5.2 NTFS流病毒 36
3.5.3 NTFS压缩病毒 37
3.5.4 ISO镜像文件感染 37
3.6 文件格式依赖性 37
3.6.1 DOS上的COM病毒 37
3.6.2 DOS上的EXE病毒 37
3.6.3 16位Windows和OS/2上的NE病毒 38
3.6.4 OS/2上的LX病毒 38
3.6.5 32位Windows上的PE病毒 38
3.6.6 UNIX上的ELF病毒 41
3.6.7 设备驱动程序病毒 41
3.6.8 目标代码和库文件病毒 42
3.7 解释环境依赖性 42
3.7.1 微软产品中的宏病毒 42
3.7.2 IBM系统中的REXX病毒 50
3.7.3 DEC/VMS上的DCL病毒 51
3.7.4 UNIX上的shell脚本(csh、ksh和bash) 51
3.7.5 Windows系统中的VBScript病毒 52
3.7.6 批处理病毒 52
3.7.7 mIRC、PIRCH脚本中的即时消息病毒 53
3.7.8 SuperLogo病毒 53
3.7.9 JScript病毒 55
3.7.10 Perl病毒 55
3.7.11 用嵌入HTML邮件的JellyScript编写的WebTV蠕虫 55
3.7.12 Python病毒 56
3.7.13 VIM病毒 56
3.7.14 EMACS病毒 56
3.7.15 TCL病毒 56
3.7.16 PHP病毒 56
3.7.17 MapInfo病毒 57
3.7.18 SAP上的ABAP病毒 57
3.7.19 Windows帮助文件病毒——当你按下F1 57
3.7.20 Adobe PDF中的JScript威胁 58
3.7.21 AppleScript的依赖性 58
3.7.22 ANSI的依存关系 58
3.7.23 Macromedia Flash动作脚本(Action-Script)威胁 59
3.7.24 HyperTalk脚本威胁 59
3.7.25 AutoLisp脚本病毒 60
3.7.26 注册表依赖性 60
3.7.27 PIF和LNK的依赖性 61
3.7.28 Lotus Word专业版中的宏病毒 61
3.7.29 AmiPro的文档病毒 61
3.7.30 Corel脚本病毒 61
3.7.31 Lotus 1-2-3宏的依赖性 62
3.7.32 Windows安装脚本的依赖性 62
3.7.33 AUTORUN.INF和Windows INI File依存性 62
3.7.34 HTML依赖性 63
3.8 系统漏洞依赖性 63
3.9 日期和时间依赖性 63
3.10 JIT依赖性:Microsoft.NET病毒 64
3.11 档案文件格式依赖性 65
3.12 基于扩展名的文件格式依赖性 65
3.13 网络协议依赖性 66
3.14 源代码依赖关系 66
3.15 在Mac和Palm平台上的资源依赖性 68
3.16 宿主大小依赖性 68
3.17 调试器依赖性 69
3.18 编译器和连接器依赖性 70
3.19 设备翻译层依赖性 71
3.20 嵌入式对象插入依赖性 73
3.21 自包含环境的依赖性 73
3.22 复合病毒 74
3.23 结论 75
参考文献 76
第4章 感染策略的分类 79
4.1 引导区病毒 79
4.1.1 主引导记录感染技术 80
4.1.2 DOS引导记录感染技术 82
4.1.3 随Windows 95发作的引导区病毒 83
4.1.4 在网络环境下对引导映像的可能攻击 84
4.2 文件感染技术 84
4.2.1 重写病毒 84
4.2.2 随机重写病毒 85
4.2.3 追加病毒 85
4.2.4 前置病毒 86
4.2.5 典型的寄生病毒 87
4.2.6 蛀穴病毒 88
4.2.7 分割型蛀穴病毒 88
4.2.8 压缩型病毒 89
4.2.9 变形虫感染技术 90
4.2.10 嵌入式解密程序技术 90
4.2.11 嵌入式解密程序和病毒体技术 91
4.2.12 迷惑性欺骗跳转技术 92
4.2.13 入口点隐蔽病毒 92
4.2.14 未来可能的感染技术:代码建造器 99
4.3 深入分析Win32病毒 99
4.3.1 Win32 API及其支持平台 100
4.3.2 32位Windows感染技术 102
4.3.3 Win32和Win64病毒:是针对Microsoft Windows设计的吗 116
4.4 结论 118
参考文献 118
第5章 内存驻留技术 120
5.1 直接感染型病毒 120
5.2 内存驻留病毒 120
5.2.1 中断处理和钩挂 121
5.2.2 钩挂INT 13h中断例程(引导区病毒) 123
5.2.3 钩挂INT 21h中断例程(文件型病毒) 124
5.2.4 DOS环境常用的内存加载技术 127
5.2.5 隐藏型病毒 129
5.2.6 磁盘高速缓存和系统缓存感染 135
5.3 临时内存驻留病毒 136
5.4 交换型病毒 137
5.5 进程病毒(用户模式) 137
5.6 内核模式中的病毒(Windows 9x/Me) 137
5.7 内核模式中的病毒(Windows NT/2000/XP) 138
5.8 通过网络传播的内存注入病毒 139
参考文献 140
第6章 基本的自保护策略 141
6.1 隧道病毒 141
6.1.1 通过扫描内存查找原中断处理例程 141
6.1.2 跟踪调试接口 141
6.1.3 基于代码仿真的隧道技术 142
6.1.4 使用I/O端口直接访问磁盘 142
6.1.5 使用未公开的函数 142
6.2 装甲病毒 142
6.2.1 反反汇编 143
6.2.2 数据加密 143
6.2.3 使用代码迷惑对抗分析 144
6.2.4 基于操作码混合的代码迷惑 145
6.2.5 使用校验和 146
6.2.6 基于压缩的隐蔽代码 146
6.2.7 反跟踪 147
6.2.8 抗启发式检测技术 152
6.2.9 抗仿真技术 158
6.2.10 抗替罪羊病毒 161
6.3 攻击性的反制病毒 162
参考文献 163
第7章 高级代码演化技术和病毒生成工具 165
7.1 引言 165
7.2 代码演化 165
7.3 加密病毒 166
7.4 寡形病毒 169
7.5 多态病毒 171
7.5.1 1260病毒 171
7.5.2 Dark Avenger病毒中的突变引擎(MtE) 172
7.5.3 32位多态病毒 174
7.6 变形病毒 177
7.6.1 什么是变形病毒 177
7.6.2 简单的变形病毒 178
7.6.3 更加复杂的变形病毒和置换技术 179
7.6.4 置换其他程序:病毒机的终极版 181
7.6.5 高级变形病毒:Zmist 182
7.6.6 {W32,Linux}/Simile:跨平台的变形引擎 185
7.7 病毒机 190
7.7.1 VCS 190
7.7.2 GenVir 190
7.7.3 VCL 190
7.7.4 PS-MPC 191
7.7.5 NGVCK 191
7.7.6 其他病毒机和变异工具 192
7.7.7 如何测试病毒机 193
参考文献 193
第8章 基于病毒载荷的分类方法 195
8.1 没有载荷 195
8.2 偶然破坏型载荷 196
8.3 非破坏型载荷 196
8.4 低破坏型载荷 197
8.5 强破坏型载荷 198
8.5.1 数据重写型病毒 198
8.5.2 数据欺骗 199
8.5.3 加密数据的病毒:好坏难辨 200
8.5.4 破坏硬件 201
8.6 DoS攻击 201
8.7 窃取数据:用病毒牟利 203
8.7.1 网络钓鱼攻击 203
8.7.2 后门 204
8.8 结论 205
参考文献 205
第9章 计算机蠕虫的策略 207
9.1 引言 207
9.2 计算机蠕虫的通用结构 208
9.2.1 目标定位 208
9.2.2 感染传播 208
9.2.3 远程控制和更新接口 208
9.2.4 生命周期管理 209
9.2.5 蠕虫载荷 209
9.2.6 自跟踪 210
9.3 目标定位 210
9.3.1 收集电子邮件地址 210
9.3.2 网络共享枚举攻击 214
9.3.3 网络扫描和目标指纹分析 215
9.4 感染传播 218
9.4.1 攻击安装了后门的系统 218
9.4.2 点对点网络攻击 219
9.4.3 即时消息攻击 220
9.4.4 电子邮件蠕虫攻击和欺骗技术 220
9.4.5 插入电子邮件附件 220
9.4.6 SMTP代理攻击 221
9.4.7 SMTP攻击 221
9.4.8 使用MX查询进行SMTP传播 223
9.4.9 NNTP攻击 223
9.5 常见的蠕虫代码传送和执行技术 224
9.5.1 基于可执行代码的攻击 224
9.5.2 连接到Web站点或者Web代理 224
9.5.3 基于HTML的邮件 225
9.5.4 基于远程登录的攻击 225
9.5.5 代码注入攻击 225
9.5.6 基于shellcode的攻击 226
9.6 计算机蠕虫的更新策略 228
9.6.1 在Web和新闻组上的认证更新 229
9.6.2 基于后门的更新 232
9.7 用信令进行远程控制 232
9.8 有意无意的交互 234
9.8.1 合作 234
9.8.2 竞争 236
9.8.3 未来:简单蠕虫通信协议 237
9.9 无线移动蠕虫 237
参考文献 239
第10章 漏洞利用、漏洞和缓冲区溢出攻击 241
10.1 引言 241
10.1.1 混合攻击的定义 241
10.1.2 威胁 241
10.2 背景 242
10.3 漏洞的类型 243
10.3.1 缓冲区溢出 243
10.3.2 第一代缓冲区溢出攻击 243
10.3.3 第二代攻击 245
10.3.4 第三代攻击 250
10.4 攻击实例 261
10.4.1 1988年的Morris蠕虫(利用堆栈溢出执行shellcode) 261
10.4.2 1998年的Linux/ADM(“抄袭”Morris蠕虫) 263
10.4.3 2001年爆发的CodeRed(代码注入攻击) 263
10.4.4 2002年的Linux/Slapper蠕虫(堆溢出实例) 266
10.4.5 2003年1月的W32/Slammer蠕虫(Mini蠕虫) 270
10.4.6 2003年8月Blaster蠕虫(Win32上基于shellcode的攻击) 272
10.4.7 计算机病毒中缓冲区溢出的一般用法 274
10.4.8 W32/Badtrans.B@mm描述 274
10.4.9 W32/Nimda.A@mm所用的漏洞攻击方法 274
10.4.10 W32/Bolzano描述 275
10.4.11 VBS/Bubbleboy描述 276
10.4.12 W32/Blebla描述 277
10.5 小结 277
参考文献 278
第二部分 防御者的策略 281
第11章 病毒防御技术 281
11.1 第一代扫描器 282
11.1.1 字符串扫描 282
11.1.2 通配符 284
11.1.3 不匹配字节数 285
11.1.4 通用检测法 285
11.1.5 散列 285
11.1.6 书签 286
11.1.7 首尾扫描 287
11.1.8 入口点和固定点扫描 287
11.1.9 超快磁盘访问 288
11.2 第二代扫描器 288
11.2.1 智能扫描 288
11.2.2 骨架扫描法 289
11.2.3 近似精确识别法 289
11.2.4 精确识别法 290
11.3 算法扫描方法 291
11.3.1 过滤法 292
11.3.2 静态解密程序检测法 293
11.3.3 X光检测法 294
11.4 代码仿真 298
11.4.1 用代码仿真来检测加密和多态病毒 301
11.4.2 动态解密程序检测法 303
11.5 变形病毒检测实例 304
11.5.1 几何检测法 305
11.5.2 反汇编技术 305
11.5.3 采用仿真器进行跟踪 306
11.6 32位Windows病毒的启发式分析 308
11.6.1 代码从最后一节开始执行 309
11.6.2 节头部可疑的属性 309
11.6.3 PE可选头部有效尺寸的值不正确 309
11.6.4 节之间的“间隙” 309
11.6.5 可疑的代码重定向 309
11.6.6 可疑的代码节名称 310
11.6.7 可能的头部感染 310
11.6.8 来自KERNEL32.DLL的基于序号的可疑导入表项 310
11.6.9 导入地址表被修改 310
11.6.10 多个PE头部 310
11.6.11 多个Windows程序头部和可疑的KERNEL32.DLL导入表项 310
11.6.12 可疑的重定位信息 310
11.6.13 内核查询 311
11.6.14 内核的完整性 311
11.6.15 把节装入到VMM的地址空间 311
11.6.16 可选头部的SizeOfCode域取值不正确 311
11.6.17 含有多个可疑标志的例子 311
11.7 基于神经网络的启发式分析 312
11.8 常规及通用清除法 314
11.8.1 标准清除法 314
11.8.2 通用解密程序 315
11.8.3 通用清除程序如何工作 316
11.8.4 清除程序如何确定一个文件是否染毒 316
11.8.5 宿主文件原来的结尾在哪里 316
11.8.6 能用这种方法清除的病毒有多少类 316
11.8.7 通用修复法中的启发性标记实例 317
11.8.8 通用清除过程实例 318
11.9 接种 319
11.10 访问控制系统 319
11.11 完整性检查 320
11.11.1 虚警 321
11.11.2 干净的初始状态 321
11.11.3 速度 322
11.11.4 特殊对象 322
11.11.5 必须有对象发生改变 322
11.11.6 可能的解决方案 322
11.12 行为阻断 323
11.13 沙箱法 324
11.14 结论 325
参考文献 325
第12章 内存扫描与杀毒 328
12.1 引言 329
12.2 Windows NT虚拟内存系统 330
12.3 虚拟地址空间 331
12.4 用户模式的内存扫描 334
12.4.1 NtQuerySystemlnformation()的秘密 334
12.4.2 公共进程及特殊的系统权限 335
12.4.3 Win32子系统中的病毒 336
12.4.4 分配私有页面的Win32病毒 337
12.4.5 原生Windows NT服务病毒 338
12.4.6 使用隐藏窗口过程的Win32病毒 339
12.4.7 被执行映像自身包含的Win32病毒 339
12.5 内存扫描和页面调度 341
12.6 内存杀毒 342
12.6.1 终止包含病毒代码的特定进程 342
12.6.2 检测和终止病毒线程 343
12.6.3 修复活跃页面中的病毒代码 345
12.6.4 如何为已装入内存的DLL及运行中的应用程序杀毒 346
12.7 内核模式的内存扫描 346
12.7.1 扫描进程的用户地址空间 346
12.7.2 确定NT服务API的入口点 347
12.7.3 用于内核模式内存扫描的重要NT函数 348
12.7.4 进程上下文 348
12.7.5 扫描地址空间上部的2GB 349
12.7.6 如何使一个过滤驱动程序病毒失去活性 349
12.7.7 对付只读型的内核内存 350
12.7.8 64位平台上内核模式的内存扫描 351
12.8 可能的内存扫描攻击 353
12.9 结论和下一步工作 354
参考文献 354
第13章 蠕虫拦截技术和基于主机的入侵防御 356
13.1 引言 356
13.1.1 脚本拦截和SMTP蠕虫拦截 357
13.1.2 需要拦截的新型攻击:CodeRed,Slammer 359
13.2 缓冲区溢出攻击的对策 359
13.2.1 代码复查 360
13.2.2 编译器级的解决方案 361
13.2.3 操作系统级的解决方案和运行时扩展 366
13.2.4 子系统扩展——Libsafe 367
13.2.5 内核模式扩展 368
13.2.6 程序监管 369
13.3 蠕虫拦截技术 369
13.3.1 注入代码检测 369
13.3.2 发送拦截:自发送型代码的 374
拦截实例 374
13.3.3 异常处理程序验证 375
13.3.4 减轻Return-to-LIBC攻击的其他技术 378
13.3.5 “GOT”和“IAT”页面属性 381
13.3.6 高连接数和大量的连接错误 382
13.4 未来可能出现的蠕虫攻击 382
13.4.1 反制蠕虫数量的可能增长 382
13.4.2 雷达探测不到的“慢”蠕虫 382
13.4.3 多态和变形蠕虫 383
13.4.4 大规模的破坏 384
13.4.5 自动化的漏洞利用代码发现——从环境中学习 384
13.5 结论 384
参考文献 385
第14章 网络级防御策略 387
14.1 引言 387
14.2 使用路由器访问列表 388
14.3 防火墙保护 389
14.4 网络入侵检测系统 391
14.5 蜜罐系统 392
14.6 反击 395
14.7 早期预警系统 395
14.8 蠕虫的网络行为模式 396
14.8.1 捕捉Blaster蠕虫 396
14.8.2 捕捉Linux/Slapper蠕虫 397
14.8.3 捕捉W32/Sasser.D蠕虫 399
14.8.4 捕获W32/Welchia蠕虫的ping请求 401
14.8.5 检测W32/Slammer及相关的漏洞利用代码 401
14.9 结论 403
参考文献 403
第15章 恶意代码分析技术 404
15.1 个人的病毒分析实验室 404
15.2 信息、信息、信息 406
15.2.1 系统结构指南 406
15.2.2 知识库 406
15.3 VMware上的专用病毒分析系统 407
15.4 计算机病毒分析过程 408
15.4.1 准备 408
15.4.2 脱壳 413
15.4.3 反汇编和解密 413
15.4.4 动态分析技术 419
15.5 维护恶意代码库 437
15.6 自动分析:数字免疫系统 437
参考文献 439
第16章 结论 441
进一步阅读资料 441
安全和早期预警方面的信息 441
安全更新 442
计算机蠕虫爆发统计数据 442
计算机病毒研究论文 442
反病毒厂商联系方式 443
反病毒产品测试机构及相关网站 444