第 1章 多线程编程 1
1.1 使用多线程的必要性 2
1.2 多线程编程 5
1.3 线程的终止及其他相关函数 8
1.4 线程间的通信 10
1.4.1 全局变量 11
1.4.2 自定义消息 11
1.4.3 事件对象 15
1.4.4 手动和自动重置事件对象 22
1.5 线程间的同步 25
1.5.1 用户模式线程同步 28
1.5.2 内核模式线程同步 36
第 2章 内存管理 48
2.1 保护模式的分段与分页管理机制 50
2.2 获取系统信息与内存状态 53
2.3 虚拟地址空间管理函数 56
2.3.1 虚拟地址空间的分配与释放 57
2.3.2 改变页面保护属性 60
2.3.3 查询页面信息 61
2.4 堆管理函数 62
2.4.1 私有堆的创建和释放 63
2.4.2 在堆中分配和释放内存块 64
2.4.3 其他堆管理函数 67
2.4.4 在C++中使用堆 68
2.5 其他内存管理函数 70
第3章 文件、驱动器和目录操作 72
3.1 基本概念 73
3.1.1 与硬盘存储有关的几个重要概念 73
3.1.2 分区、逻辑驱动器、文件系统和卷 74
3.1.3 文件名、目录、路径和当前目录 76
3.2 文件操作 77
3.2.1 创建和打开文件 77
3.2.2 读写文件 80
3.2.3 文件指针 83
3.2.4 文件属性 85
3.2.5 复制文件 87
3.2.6 移动文件(目录)、删除文件 90
3.2.7 无缓冲I/O 93
3.3 逻辑驱动器和目录 94
3.3.1 逻辑驱动器操作 94
3.3.2 目录操作 96
3.3.3 环境变量 102
3.3.4 SHFileOperation函数 106
3.3.5 监视目录变化 107
3.3.6 获取硬盘序列号 112
3.3.7 可移动硬盘和U盘监控 118
3.3.8 获取主板和BIOS序列号 121
3.4 内存映射文件 127
3.4.1 内存映射文件相关函数 128
3.4.2 通过内存映射文件在多个进程间共享数据 134
3.4.3 使用内存映射文件来处理大型文件 136
3.5 APC异步过程调用 137
第4章 进程 143
4.1 创建进程 143
4.2 多个进程间共享内核对象 150
4.3 进程终止 153
4.4 进程间通信 154
4.4.1 WM_COPYDATA 154
4.4.2 管道 159
4.4.3 邮件槽 164
4.5 进程枚举 165
4.5.1 TlHelp32系列函数 165
4.5.2 EnumProcesses函数 177
4.5.3 进程环境块PEB 181
4.6 进程调试 185
4.6.1 读写其他进程的地址空间 185
4.6.2 获取一个以暂停模式启动的进程模块基地址 189
4.6.3 调试API 193
4.6.4 内存补丁 199
4.6.5 线程环境 204
4.7 窗口间谍 207
4.8 示例:一个程序退出时删除自身 213
第5章 剪贴板 215
5.1 剪贴板常用函数与消息 215
5.1.1 基本剪贴板函数 215
5.1.2 剪贴板相关的消息 218
5.2 使用剪贴板进行进程间通信 220
5.2.1 Clipboard写入端 221
5.2.2 Clipboard读取端 226
5.3 监视剪贴板内容变化 230
5.3.1 相关函数和消息 230
5.3.2 剪贴板监视程序ClipboardMonitor 232
5.3.3 监视剪贴板的新方法 235
第6章 动态链接库 236
6.1 静态链接库 236
6.2 动态链接库 237
6.2.1 创建DLL项目 238
6.2.2 在可执行模块中使用DLL 244
6.2.3 入口点函数DllMain 246
6.2.4 延迟加载DLL 248
6.3 线程局部存储 252
6.3.1 动态TLS 253
6.3.2 静态TLS 256
6.4 Windows钩子 258
6.5 在同一个可执行文件的多个实例间共享变量 265
6.6 注入DLL 267
6.6.1 通过Windows钩子注入DLL 267
6.6.2 通过创建远程线程注入DLL 276
6.6.3 通过函数转发器机制注入DLL 283
6.6.4 通过CreateProcess函数写入ShellCode注入DLL 290
6.6.5 通过调试器写入ShellCode注入DLL 293
6.6.6 通过APC机制注入DLL 293
6.6.7 通过输入法机制注入DLL 293
6.7 Shadow API技术 299
6.8 Hook API技术 304
6.8.1 随机数 304
6.8.2 通过远程线程注入DLL实现API Hook 306
6.8.3 通过全局消息钩子注入DLL实现进程隐藏 322
第7章 INI配置文件和注册表操作 328
7.1 INI配置文件 329
7.1.1 键值对的创建、更新与删除 329
7.1.2 获取键值 330
7.1.3 管理小节 331
7.2 注册表操作 335
7.2.1 子键的打开、关闭、创建和删除 337
7.2.2 键值项的创建或设置、查询和删除 340
7.2.3 子键、键值项的枚举 344
7.2.4 注册表应用:程序开机自动运行设置文件关联 347
第8章 Windows异常处理 349
8.1 结构化异常处理 349
8.1.1 try-except语句 349
8.1.2 GetExceptionCode和GetExceptionInformation 354
8.1.3 利用结构化异常处理进行反调试 358
8.1.4 软件异常 360
8.2 向量化异常处理(全局) 361
8.2.1 向量化异常处理简介 361
8.2.2 利用向量化异常处理实现基于断点的API Hook 362
8.3 顶层未处理异常过滤(全局) 367
8.4 向量化继续处理(全局) 368
第9章 WinSock网络编程 374
9.1 OSI参考模型和TCP/IP协议簇 374
9.1.1 OSI参考模型 374
9.1.2 TCP/IP协议簇 377
9.1.3 套接字网络编程接口 379
9.2 IP地址、网络字节顺序和WinSock的地址表示方式 380
9.2.1 IP地址和端口 380
9.2.2 网络字节顺序 381
9.2.3 WinSock的地址表示方式 381
9.3 WinSock网络编程 383
9.3.1 TCP网络编程的一般步骤 384
9.3.2 TCP服务器程序 390
9.3.3 TCP客户端程序 395
9.3.4 UDP编程 399
9.3.5 P2P技术 402
9.4 WinSock异步I/O模型 403
9.4.1 阻塞模式下的多线程多客户端套接字编程 404
9.4.2 select模型 414
9.4.3 WSAAsyncSelect模型 419
9.4.4 WSAEventSelect模型 424
9.4.5 Overlapped模型 431
9.4.6 完成端口模型 447
9.4.7 深入介绍I/O完成端口 456
9.4.8 深入介绍线程池 463
9.5 IPHelper API及其他函数 474
9.5.1 获取本地计算机的网络适配器信息 475
9.5.2 其他函数 478
9.5.3 校对时间程序 480
9.6 系统网络连接的启用和禁用 482
第 10章 其他常用Windows API编程知识 489
10.1 快捷方式 489
10.2 程序开机自动启动 491
10.2.1 将程序的快捷方式写入开机自动启动程序目录 491
10.2.2 创建任务计划实现开机自动启动 493
10.2.3 创建系统服务实现开机自动启动 493
10.3 用户账户控制 508
10.3.1 自动提示用户提升权限 510
10.3.2 利用ShellExecuteEx函数以管理员权限启动程序 512
10.3.3 绕过UAC提权提示以管理员权限运行 513
10.4 用户界面特权隔离 514
10.5 窗口的查找与枚举 515
10.6 实现任务栏通知区域图标与气泡通知 517
第 11章 PE文件格式深入剖析 520
11.1 DOS头(DOS MZ头和DOSStub块) 521
11.2 PE头(IMAGE_NT_HEADER32结构) 522
11.3 节表(节区信息结构IMAGE_SECTION_HEADER列表) 531
11.4 64位可执行文件格式PE32+ 537
11.5 导入表 538
11.6 导出表 547
11.7 重定位表 552
11.8 模拟PE加载器直接加载可执行文件到进程内存中执行 555
11.9 线程局部存储表 563
11.10 加载配置信息表 568
11.11 资源表 569
11.12 延迟加载导入表 577
11.13 校验和与CRC 577
11.14 64位程序中如何书写汇编代码(以获取CPUID为例) 580
11.15 Detours-master库 583
11.15.1 注入DLL的编写 583
11.15.2 将注入DLL加载到目标进程中 586
11.15.3 编辑可执行文件 591
11.16 通过修改模块导入表中的IAT项来Hook API 592
展开