第一部分 攻击者的策略
第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
参考文献
第2章 恶意代码分析的魅力
2.1 计算机病毒研究的通用模式 16
2.2 反病毒防护技术的发展
2.3 恶意程序的相关术语
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 <infectuve_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-secific_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.cksh和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 AdobePDF中的JScript威胁 58
3.7.21 AppleScript的依赖性 58
3.7.22 ANSI的依存关系 58
3.7.23 MacromediaFlash动作脚本(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 LotusWord专业版中的宏病毒 61
3.7.29 AmiPro的文档病毒 61
3.7.30 Corel脚本病毒 61
3.7.31 Lotus1-2-3宏的依赖性 62
3.7.32 Windows安装脚本的依赖性 62
3.7.33 AUTORUN.INF和WindowsINIFile依存性 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 随Windows95发作的引导区病毒 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 Win32API及其支持平台 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 钩挂INT13h中断例程(引导区病毒) 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 内核模式中的病毒(Windows9x/Me) 137
5.7 内核模式中的病毒 (WindowsNT/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 DarkAvenger病毒中的突变引擎(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
第二部分 防御者的策略
第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