第1章 黑客编程入门 1
1.1 编程语言和开发环境的选择 1
1.1.1 何为SDK、API和MFC 2
1.1.2 VC6和SDK的配置 2
1.2 应用程序的调试 4
1.2.1 编写我们的第一个程序 4
1.2.2 用VC6调试第一个程序 6
1.2.3 专业的应用程序调试工具——OllyDbg 8
1.3 简单API的介绍 9
1.3.1 复制自身程序到Windows目录和系统目录下 9
1.3.2 获得系统的相关信息 11
1.3.3 Debug和Release的编译方式 13
1.3.4 查看函数定义 14
1.4 总结 15
第2章 木马开发剖析 16
2.1 网络通信基础 16
2.1.1 IP地址的作用与分类 16
2.1.2 端口的作用与分类 17
2.2 网络编程基础知识 17
2.2.1 通信模型 17
2.2.2 Winsock 18
2.2.3 Winsock的相关函数 18
2.2.4 字节顺序 21
2.3 简单的通信程序 22
2.3.1 基于TCP协议的“Hello World!” 22
2.3.2 基于UDP协议的“Hello World!” 24
2.4 实现一个C/S模式的简单木马 25
2.4.1 木马服务器端的实现 25
2.4.2 木马客户端的实现 28
2.5 总结 29
第3章 Windows应用编程基础 30
3.1 文件 30
3.1.1 打开文件 30
3.1.2 文件操作 31
3.2 AutoRun免疫程序的编写 32
3.2.1 AutoRun免疫原理 33
3.2.2 AutoRun免疫程序的代码实现 33
3.2.3 界面设置 33
3.2.4 代码相关部分 34
3.3 注册表操作 35
3.3.1 注册表 35
3.3.2 与注册表操作相关的常用API函数 36
3.3.3 注册表启动项的管理 37
3.3.4 程序的界面设置及相关代码 38
3.3.5 启动项的枚举 39
3.3.6 添加启动项的代码 39
3.3.7 删除启动项的代码 40
3.4 服务相关的编程 41
3.4.1 如何查看系统服务 41
3.4.2 服务控制管理器的开发 42
3.4.3 枚举服务的相关API函数 44
3.4.4 服务的停止 45
3.4.5 停止服务的相关API函数 46
3.4.6 服务的启动 46
3.5 进程与线程 47
3.5.1 进程 47
3.5.2 进程的创建 48
3.5.3 “下载者”的简单演示 48
3.5.4 CreateProcess()函数介绍与程序创建 49
3.5.5 进程的结束 52
3.5.6 进程的枚举 55
3.5.7 调整当前进程的权限 57
3.5.8 进程的暂停与恢复 58
3.5.9 多线程 62
3.6 DLL编程 66
3.6.1 什么是DLL 66
3.6.2 编写一个简单的DLL程序 66
3.6.3 对DLL程序的调用方法一 68
3.6.4 对DLL程序的调用方法二 70
3.7 远程线程 72
3.7.1 DLL注入 72
3.7.2 DLL卸载 76
3.7.3 无DLL的代码注入 77
3.8 总结 80
第4章 加密与解密 81
4.1 PE文件结构 81
4.1.1 PE文件结构全貌 81
4.1.2 MZ头部 82
4.1.3 PE头部 82
4.1.4 节表 82
4.1.5 节表数据 82
4.2 详解PE文件结构 82
4.2.1 DOS头部详解IMAGE_DOS_HEADER 82
4.2.2 PE头部详解IMAGE_NT_HEADERS 85
4.2.3 IAMGE_FILE_HEADER 86
4.2.4 IMAGE_OPTIONAL_HEADER 87
4.2.5 节区详解IMAGE_SECTION_HEADER 91
4.2.6 与PE结构相关的3种地址 92
4.2.7 3种地址的转换 93
4.3 PE查看器 96
4.4 简单的查壳工具 99
4.5 地址转换器 103
4.6 添加节区 106
4.6.1 手动添加一个节区 106
4.6.2 通过编程添加节区 110
4.7 破解基础知识及调试API函数的应用 112
4.7.1 CrackMe程序 112
4.7.2 用OD破解CrackMe 114
4.8 文件补丁及内存补丁 119
4.8.1 文件补丁 119
4.8.2 内存补丁 121
4.9 调试API函数的使用 123
4.9.1 常见的3种断点方法 123
4.9.2 调试API函数及相关结构体介绍 127
4.9.3 判断是否处于被调试状态 128
4.9.4 断点异常函数 130
4.9.5 调试事件 131
4.9.6 调试循环 132
4.9.7 内存的操作 134
4.9.8 线程环境相关API及结构体 135
4.10 打造一个密码显示器 136
4.11 总结 139
第5章 HOOK编程 141
5.1 HOOK知识前奏 141
5.2 内联钩子——Inline Hook 142
5.2.1 Inline Hook的原理 142
5.2.2 Inline Hook的实现 143
5.2.3 HOOK MessageBoxA 146
5.2.4 HOOK CreateProcessW 147
5.2.5 7字节Inline Hook 150
5.2.6 Inline Hook的注意事项 151
5.3 导入地址表钩子——IAT HOOK 154
5.3.1 导入表简介 155
5.3.2 导入表的数据结构定义 155
5.3.3 手动分析导入表 156
5.3.4 枚举导入地址表 158
5.3.5 IAT HOOK介绍 159
5.3.6 IAT HOOK之CreateFileW() 160
5.4 Windows钩子函数 163
5.4.1 钩子原理 163
5.4.2 钩子函数 163
5.4.3 键盘钩子实例 165
5.4.4 使用钩子进行DLL注入 168
5.5 总结 169
第6章 黑客编程剖析 170
6.1 恶意程序剖析 170
6.1.1 恶意程序的自启动 170
6.1.2 木马的配置生成与反弹端口 173
6.1.3 代码实现剖析 175
6.2 简单病毒剖析 179
6.2.1 病毒的感染剖析 179
6.2.2 缝隙搜索的实现 180
6.2.3 感染目标程序文件剖析 180
6.2.4 添加感染标志 182
6.2.5 自删除功能的实现 183
6.3 隐藏DLL文件 184
6.3.1 启动WinDBG 184
6.3.2 调试步骤 185
6.3.3 编写枚举进程中模块的函数 188
6.3.4 指定模块的隐藏 189
6.4 安全工具开发基础 191
6.4.1 行为监控工具开发基础 192
6.4.2 专杀工具 198
6.4.3 U盘防御软件 207
6.4.4 目录监控工具 212
6.5 引导区解析 215
6.5.1 通过WinHex来手动解析引导区 215
6.5.2 通过程序解析MBR 219
6.5.3 自定义MBR的各种结构体 220
6.5.4 解析MBR的程序实现 222
6.6 加壳与脱壳 224
6.6.1 手动加壳 224
6.6.2 编写简单的加壳工具 226
第7章 最后的旅程——简单驱动开发及逆向 229
7.1 驱动版的“Hello World” 229
7.2 驱动下的进程遍历 232
7.2.1 配置VMware和WinDbg进行驱动调试 233
7.2.2 EPROCESS和手动遍历进程 236
7.2.3 编程实现进程遍历 239
7.3 HOOK SSDT(系统服务描述表) 240
7.3.1 SSDT简介 240
7.3.2 HOOK SSDT 242
7.3.3 Inline HOOK SSDT 244
7.4 应用程序与驱动程序的通信 246
7.4.1 创建设备 247
7.4.2 应用程序与驱动程序的通信方式 248
7.4.3 应用程序与驱动程序的通信实例 249
7.5 C语言代码逆向基础 253
7.5.1 函数的识别 253
7.5.2 if......else......分支结构 258
7.5.3 switch分支结构 260
7.5.4 for循环结构 262
7.5.5 do......while与while......循环结构 263
参考文献 265