第一部分 基础篇 2
第1章 前置要求与环境搭建 2
1.1 驱动编程的语言 2
1.2 开发环境搭建 2
1.2.1 Visual Studio 2005/2008的安装与配置 2
1.2.2 WDK的安装与配置 4
1.2.3 VisualDDK的安装与配置 5
1.3 常用工具介绍 6
第2章 内核编程基础知识 7
2.1 Windows主要系统组件 7
2.1.1 对象管理器 7
2.1.2 内存管理器 7
2.1.3 进程和线程管理器 7
2.1.4 I/O管理器 8
2.1.5 PnP管理器 8
2.1.6 电源管理器 8
2.1.7 配置管理器 9
2.1.8 安全引用监视器 9
2.2 常见名词解释 9
2.2.1 内核名词 9
2.2.2 文件名词 13
2.2.3 网络名词 13
2.3 常见内核数据结构 15
2.3.1 驱动框架常见数据结构 15
2.3.2 进程与线程数据结构 17
2.3.3 存储系统数据结构 23
2.3.4 网络数据结构 25
2.3.5 其他一些常见的数据结构 29
第3章 基本编程方法 37
3.1 简单的NT式驱动模型 37
3.1.1 驱动模型的选择 37
3.1.2 NT式驱动程序基本结构 37
3.1.3 编译驱动程序 40
3.1.4 加载驱动及查看输出信息 40
3.2 应用层与内核的通信方法 43
3.2.1 访问数据的I/O方式 43
3.2.2 读写驱动程序 45
3.2.3 发送I/O控制码 49
3.2.4 内存共享 54
3.3 同步技术 56
3.3.1 事件对象 56
3.3.2 信号灯对象 57
3.3.3 互斥体对象 58
3.3.4 定时器对象 61
3.3.5 自旋锁 64
3.3.6 回调对象 64
3.3.7 原子操作 70
3.4 IRP处理 70
3.4.1 简单的IRP流动图 71
3.4.2 IRP的创建 72
3.4.3 IRP的发送 75
3.4.4 为IRP设置完成函数 76
3.4.5 IRP的完成 78
3.4.6 多种典型的IRP处理示例 85
3.5 字符串操作 89
3.5.1 STRING、ANSI_STRING和UNICODE_STRING 89
3.5.2 初始化和销毁 90
3.5.3 复制和添加 91
3.5.4 比较 92
3.5.5 转换 93
3.6 内存管理 94
3.6.1 分配系统空间内存 94
3.6.2 运行时库管理函数 95
3.6.3 使用内核栈 96
3.6.4 使用Lookaside快速链表 97
3.6.5 访问用户空间内存 101
3.6.6 存区对象和视图 101
3.6.7 MDL的使用 103
3.7 注册表编程 105
3.7.1 注册表对象管理函数 105
3.7.2 注册表运行时库函数 112
3.7.3 注册表调用过滤 116
3.8 文件编程 120
3.8.1 打开文件句柄 120
3.8.2 执行相关文件操作 121
3.9 其他 127
3.9.1 本地系统服务函数的Nt和Zw版本 127
3.9.2 NTSTATUS返回值 128
3.9.3 双向链表的使用 128
3.9.4 异常处理 129
第二部分 提升篇 132
第4章 进程 132
4.1 进程监控实现原理 132
4.2 Windows 7系统下的进程监控软件实例 132
4.2.1 内核模块程序实现 132
4.2.2 用户模式程序实现 149
4.3 安装与使用 164
第5章 磁盘 165
5.1 存储驱动体系结构 165
5.2 设备树示例 166
5.3 diskperf磁盘过滤驱动 167
5.3.1 diskperf介绍 167
5.3.2 diskperf的过滤框架 168
5.3.3 diskperf的PnP支持 172
5.3.4 diskperf的硬盘访问监控和性能数据捕获 187
5.3.5 diskperf的电源支持 194
5.3.6 diskperf的安装与测试 194
第6章 键盘 197
6.1 原理跟踪 197
6.1.1 自下而上的过程 197
6.1.2 自上而下的过程 205
6.2 几种常见的键盘记录行为 208
6.2.1 应用层的消息钩子 208
6.2.2 键盘过滤驱动 208
6.2.3 键盘类驱动的分发函数Hook 214
6.2.4 DKOM技术 214
6.2.5 其他方法 215
6.3 反键盘记录 216
6.3.1 实现原理 216
6.3.2 反键盘记录示例 216
第7章 文件 242
7.1 原理跟踪 242
7.1.1 Windows存储栈 242
7.1.2 不涉及缓存的数据存储 243
7.1.3 涉及缓存的数据存储 253
7.2 简单的文件隐藏 254
7.2.1 文件隐藏的原理 254
7.2.2 文件隐藏的实现 255
7.3 scanner扫描程序 264
7.3.1 过滤管理器与微过滤驱动概念 265
7.3.2 使用过滤管理模型的优势 266
7.3.3 微过滤驱动的加载和卸载 267
7.3.4 用户模式和内核模式的交互 269
7.3.5 scanner介绍 287
7.3.6 scanner驱动程序 288
7.3.7 scanner应用层程序 303
7.3.8 scanner的安装与使用 309
第8章 网络 310
8.1 原理跟踪 310
8.2 NDIS协议驱动 317
8.2.1 DriverEntry 317
8.2.2 绑定 320
8.2.3 数据发送 327
8.2.4 数据接收 334
8.2.5 数据流动总结 348
8.3 OPEN_BLOCK的展示 349
8.3.1 原理知识 349
8.3.2 相关代码 351
第三部分 辅助篇 358
第9章 安全编码 358
9.1 蓝屏的概念 358
9.2 创建可靠的驱动程序 359
9.2.1 验证设备对象 359
9.2.2 使用安全字符串 359
9.2.3 验证对象句柄 362
9.2.4 支持多CPU 363
9.2.5 确认驱动状态 364
9.2.6 IRP安全检查 364
9.3 使用驱动验证程序 369
9.3.1 驱动验证程序的测试选项 369
9.3.2 使用驱动验证程序 388
第10章 调试与逆向 389
10.1 静态调试 389
10.1.1 静态调试驱动程序 389
10.1.2 静态调试应用程序 390
10.2 动态调试 392
10.2.1 双机调试的基本方法 392
10.2.2 WinDbg的常用命令 394
10.2.3 WinDbg的使用技巧 397
10.3 逆向与调试相结合 408
10.3.1 示例 408