第 1 章 EDR 架构 1
1.1 EDR 的组件 1
1.1.1 代理 1
1.1.2 遥测数据 2
1.1.3 传感器 3
1.1.4 检测 3
1.2 规避 EDR 的挑战 4
1.3 识别恶意活动 5
1.3.1 考虑上下文 5
1.3.2 脆弱检测与鲁棒检测的应用 6
1.3.3 探索弹性检测规则 7
1.4 代理设计 9
1.4.1 基础设计 9
1.4.2 中级设计 10
1.4.3 高级设计 11
1.5 绕过类型 12
1.6 关联规避技术:一次攻击示例 13
1.7 总结 15
第 2 章 函数挂钩 DLL 16
2.1 函数挂钩的工作原理 16
2.1.1 使用 Microsoft Detours 实现挂钩 18
2.1.2 注入 DLL 21
2.2 检测函数挂钩 22
2.3 规避函数挂钩 24
2.3.1 直接系统调用 24
2.3.2 动态解析系统调用编号 27
2.3.3 重新映射 ntdll.dll 28
2.4 总结 32
第 3 章 进程与线程创建通知 33
3.1 通知回调例程的工作原理 33
3.2 进程通知 34
3.2.1 注册进程回调例程 35
3.2.2 查看系统上注册的回调例程 36
3.2.3 收集进程创建信息 37
3.3 线程通知 39
3.3.1 注册线程回调例程 39
3.3.2 检测远程线程创建 40
3.4 规避进程和线程创建回调 42
3.4.1 命令行篡改 42
3.4.2 伪造父进程 ID 46
3.4.3 进程镜像修改 50
3.5 一个进程注入案例研究:fork&run 60
3.6 结论 62
第 4 章 对象通知 63
4.1 对象通知的工作原理 63
4.1.1 注册新的回调 63
4.1.2 监视新的和重复的进程句柄请求 65
4.2 检测 EDR 正在监视的对象 67
4.3 检测驱动程序触发后的行为 69
4.4 绕过认证攻击中的对象回调 71
4.4.1 执行句柄窃取 72
4.4.2 竞速回调例程 77
4.5 结论 82
第 5 章 镜像加载与注册表通知 83
5.1 镜像加载通知的工作原理 83
5.1.1 注册回调例程 83
5.1.2 查看系统上注册的回调例程 84
5.1.3 收集镜像加载信息 85
5.2 使用隧道工具规避镜像加载通知 88
5.3 使用镜像加载通知触发 KAPC 注入 90
5.3.1 理解 KAPC 注入 90
5.3.2 获取 DLL 加载函数指针 91
5.3.3 准备注入 92
5.3.4 创建 KAPC 结构体 93
5.3.5 APC 队列 94
5.4 防止 KAPC 注入 95
5.5 注册表通知的工作原理 96
5.5.1 注册注册表通知 98
5.5.2 缓解性能挑战 100
5.6 规避注册表回调 102
5.7 使用回调条目覆盖规避 EDR 驱动程序 106
5.8 结论 107
第 6 章 文件系统微筛选器驱动程序 108
6.1 传统过滤器和过滤器管理器 108
6.2 微筛选器架构 110
6.3 编写微筛选器 113
6.3.1 开始注册 113
6.3.2 定义前操作回调 115
6.3.3 定义后操作回调 118
6.3.4 定义可选回调 119
6.3.5 激活微筛选器 119
6.4 管理微筛选器 120
6.5 使用微筛选器检测对手的战术 121
6.5.1 文件检测 121
6.5.2 命名管道检测 122
6.6 规避微筛选器 124
6.6.1 卸载 124
6.6.2 预防 126
6.6.3 干扰 127
6.7 结论 127
第 7 章 网络过滤驱动程序 128
7.1 基于网络与终端的监控 128
7.2 传统网络驱动接口规范驱动程序 130
7.3 Windows 过滤平台 131
7.3.1 过滤引擎 132
7.3.2 过滤仲裁 132
7.3.3 回调驱动程序 133
7.4 使用网络过滤器检测对手的战术 133
7.4.1 打开过滤引擎会话 134
7.4.2 注册回调 134
7.4.3 将回调函数添加到过滤引擎 135
7.4.4 添加新过滤器对象 136
7.4.5 分配权重和子层 139
7.4.6 添加安全描述符 140
7.5 通过网络过滤器检测对手战术 141
7.5.1 基础网络数据 142
7.5.2 元数据 144
7.5.3 层数据 145
7.6 绕过网络过滤 146
7.7 小结 150
第 8 章 Windows 事件追踪 151
8.1 架构 151
8.1.1 提供者 151
8.1.2 控制器 157
8.1.3 消费者 159
8.2 创建消费者以识别恶意的.NET 程序集 159
8.2.1 创建追踪会话 160
8.2.2 启用提供者 162
8.2.3 启动追踪会话 164
8.2.4 停止追踪会话 166
8.2.5 处理事件 167
8.2.6 测试消费者 175
8.3 规避基于 ETW 的检测 175
8.3.1 补丁 176
8.3.2 配置修改 176
8.3.3 追踪会话篡改 176
8.3.4 追踪会话干扰 177
8.4 绕过.NET 消费者 177
8.5 结论 181
第 9 章 扫描器 182
9.1 防病毒扫描器简史 182
9.2 扫描模式 183
9.2.1 按需扫描 183
9.2.2 按访问扫描 184
9.3 规则集 185
9.4 案例研究:YARA 186
9.4.1 理解 YARA 规则 186
9.4.2 逆向工程规则 189
9.5 规避扫描器签名 190
9.6 结论 193
第 10 章 反恶意软件扫描接口 194
10.1 脚本恶意软件的挑战 194
10.2 AMSI 的工作原理 196
10.2.1 探索 PowerShell 的 AMSI 实现 197
10.2.2 理解 AMSI 的底层工作机制 200
10.2.3 实现自定义 AMSI 提供者 205
10.3 规避 AMSI 209
10.3.1 字符串混淆 209
10.3.2 AMSI 修补 210
10.3.3 无补丁 AMSI 绕过 211
10.4 结论 212
第 11 章 早期启动反恶意软件驱动程序 213
11.1 ELAM 驱动程序如何保护启动过程 214
11.2 开发 ELAM 驱动程序 215
11.2.1 注册回调例程 215
11.2.2 应用检测逻辑 218
11.3 驱动程序示例:阻止 Mimidrv 加载 219
11.4 加载 ELAM 驱动程序 220
11.4.1 签署驱动程序 221
11.4.2 设置加载顺序 223
11.5 规避 ELAM 驱动程序 225
11.6 令人遗憾的现实 226
11.7 结论 227
第 12 章 微软 Windows 威胁情报 228
12.1 对提供者进行逆向工程 228
12.1.1 检查提供者和事件是否已启用 229
12.1.2 确定触发的事件 231
12.2 确定事件的来源 234
12.2.1 使用 Neo4j 发现传感器触发点 235
12.2.2 获取可与 Neo4j 配合使用的数据集 236
12.2.3 查看调用树 237
12.3 消费 EtwTi 事件 240
12.3.1 理解受保护进程 241
12.3.2 创建受保护的进程 243
12.3.3 处理事件 248
12.4 规避 EtwTi 249
12.4.1 并存 249
12.4.2 追踪句柄覆盖 249
12.5 结论 253
第 13 章 案例研究:面向检测的攻击 254
13.1 作战规则 254
13.2 初始访问 255
13.2.1 编写载荷 255
13.2.2 传递载荷 257
13.2.3 执行载荷 258
13.2.4 建立命令与控制 259
13.2.5 规避内存扫描 261
13.3 持久化 261
13.4 侦察 264
13.5 权限提升 266
13.5.1 获取频繁用户列表 266
13.5.2 劫持文件处理器 267
13.6 横向移动 274
13.6.1 查找目标 274
13.6.2 枚举共享 275
13.7 文件外传 278
13.8 结论 279