标题：天书夜读:从汇编语言到Windows内核编程
图书信息
作　者： 谭文，邵坚磊 著 
出 版 社： 电子工业出版社
出版时间： 2008-12-1
页　数： 284页
开　本： 16开
I S B N ：9787121073397 
分类： 图书 >> 计算机 >> 编程 
定价：￥65.00元
宣传语：
从貌似天书的汇编代码中，一探Windows底层的核心实现。
在开发中出现的问题，能从Windows自身找到答案！
编辑推荐
我作为驱动开发的老兵，深感资料缺乏的艰辛，很多信息无法在文档中找到，此时自力更生的能力更加重要。
当我们手中拿着神兵利器——WinDbg时，一切都在掌握之中。这本书将要告诉您的不是全面的汇编知识或未公开的Windows秘密，而是怎么从这些貌似天书的汇编代码中，一探Windows底层的核心实现。
在开发中出现的问题，能不能从Windows自身找到答案?如果您正在这样思考，无疑本书是为您度身订做的。
本书授人以渔，也授人以鱼；短小精悍，读之如一缕清风，读罢则有醍醐灌顶之感。
——驱动开发网站长 马勇（znsoft）
内 容 简 介
本书适合使用C/C++在Windows上编程的读者，尤其适合希望加深自己技术功底的Windows应用程序员、计算机专业的有志于软件开发的大中院校学生；专业的Windows内核程序员，亦可从本书得到超越一般内核程序开发的启发。
作者简介
谭文：从2002年到2008年，从事信息安全类软件的Windows内核驱动的开发工作。从2008年开始参与一个主要涉及不同架构之间二进制指令的实时翻译技术的项目的开发。业余时间在驱动开发音以楚狂人为笔名发表了许多技术文章。
前 言
Windows是庞大复杂的系统。由于Windows并不公开源代码，我们在调试程序的时候，往往就调到自己未知的领域去了。没有C代码，只能看到令人眼花缭乱的汇编指令和机器码。我曾对它们望而生畏，敬而远之。尤其在这个黑客、破解、病毒、木马横行的时代，如果作为安全软件的开发者，同样不能期盼病毒的作者提供可以阅读的高级语言代码。
如果那些东西，也和C语言一样亲切易懂，那多么好啊！这样的话，即便是Windows这样庞大复杂而且封闭的系统，或者是再诡异和隐蔽的破坏技术，至少只要我愿意去探索，对我来说就不再有秘密可言。
其实这个梦想并非不切实际。既然我们能读懂C代码，何以就不能读懂汇编呢？很多高手眼中，机器指令和C代码一样熟悉。
这本书并没有系统地介绍Windows系统底层。但是我尝试寻找正确的方法和手段，为读者打开Windows底层知识宝库的大门，使读者可以在其中自由阅读，自己去获取所需知识。
本书强调汇编语言的应用。虽然没有像指令手册那样罗列所有指令的细节，但是让读者在实践中熟悉实用的汇编指令。我一般把汇编语言用于调试和理解程序，在写代码时应用较少。但是汇编是了解没有代码的二进制代码的基础。
这里着重于Windows内核编程，包括WDK、WinDbg的使用，但是Windows内核开发体系庞大复杂，这方面已经有很多的经典书籍可以阅读。在这里我只提到了简单、实用和必要的部分。
对于安全软件的开发者，尤其是有兴趣在Windows系统下开发反病毒软件的内核驱动读者，会学到基础的研究方法。
由于这一切都从阅读和理解机器指令出发，所以名为“天书夜读”。
“天书夜读”是通向软件底层技术的一个大门与捷径。这里涉及的每个方面的技术，无论是CPU底层架构与机器指令、汇编语言、Windows内核编程、软件逆向工程还是软件调试，无一不是入门艰难的技术，许多技术者在开始时就被汗牛充栋的庞杂资料吓倒。用一条简洁明确的线，把它们串联起来，使读者可以从最基础入门，循序渐进地接触到高深的技术，并应用于实际。避免一开始就面对浩瀚的文档资料而茫然不知如何入手，也不知如何学以致用，这就是我写这本书的目的。
本书正文的内容是从读者很可能已经遗忘的汇编语言的基础指令开始，介绍C语言与汇编指令的关系，为阅读用C语言编写的Windows内核做准备。然后开始讲解Windows内核的C语言编程的基础。让读者能熟悉使用C语言开发Windows内核程序。接着指导读者进行内核的开发和调试环境的配置，并进行了一系列的尝试：阅读Windows内核的部分实现代码，并尝试自己去实现它。与此同时，产生了修改已有内核的需求。于是接下来介绍了机器码指令和汇编语言的关系，以及能够解读机器码的反汇编引擎，并以此为基础，介绍了进行Windows内核Hook开发的方法。之后是Windows内核Hook的一个利用：我们举出了一个防止病毒木马感染的安全防毒软件的例子。在此之后，简要介绍了更深层次的病毒与安全的对抗：Rootkit与HIPS。最后是一些防止代码与技术被阅读者“偷学”的章节。
相信读者读完此书，无论是对汇编语言的掌握，还是Windows编程的技术，以及对Windows系统的了解和调试程序、查找修正故障的能力，都会得到一个飞跃式的提高。
目 录
入手篇 熟悉汇编
本书的第一部分，将帮助读者消除对汇编的恐惧，熟悉汇编。本部分包括第1~3章。稍显枯燥的是，它们和Windows内核无关，是纯C语言与汇编语言的关系的章节。如果读者已经精通汇编语言，并能顺利阅读汇编代码，请直接跳过本部分。
第1章 汇编指令与C语言 2
1.1 上机建立第一个工程 4
1.1.1 用Visual Studio创建工程 4
1.1.2 用Visual Studio查看汇编代码 5
1.2 简要复习常用的汇编指令 6
1.2.1 堆栈相关指令 6
1.2.2 数据传送指令 7
1.2.3 跳转与比较指令 8
1.3 C函数的参数传递过程 9
第2章 C语言的流程和处理 14
2.1 C语言的循环反汇编 15
2.1.1 for循环 15
2.1.2 do循环 16
2.1.3 while循环 17
2.2 C语言判断与分支的反汇编 18
2.2.1 if-else判断分支 18
2.2.2 switch-case判断分支 19
2.3 C语言的数组与结构 22
2.4 C语言的共用体和枚举类型 24
第3章 练习反汇编C语言程序 26
3.1 算法的反汇编 27
3.1.1 算法反汇编代码分析 27
3.1.2 算法反汇编阅读技巧 28
3.2 发行版的反汇编 29
3.3 汇编反C语言练习 33
基础篇 内核编程
本书的第二部分，是编写Windows内核程序编程方法的基础。本部分包括第4~7章，如果读者对Windows内核编程已经有一定的了解，可以跳过本部分；如果读者从未接触过Windows内核编程，本部分将指导读者开始Windows内核编程，学会使用WDK，并熟悉内核编程的习惯与方法。
第4章 内核字符串与内存 38
4.1 字符串的处理 39
4.1.1 使用字符串结构 39
4.1.2 字符串的初始化 41
4.1.3 字符串的拷贝 42
4.1.4 字符串的连接 42
4.1.5 字符串的打印 43
4.2 内存与链表 45
4.2.1 内存的分配与释放 45
4.2.2 使用LIST_ENTRY 46
4.2.3 使用长长整型数据 49
4.2.4 使用自选锁 50
第5章 文件与注册表操作 52
5.1 文件操作 53
5.1.1 使用OBJECT_ATTRIBUTES 53
5.1.2 打开和关闭文件 54
5.1.3 文件读/写操作 58
5.2 注册表操作 60
5.2.1 注册表键的打开 60
5.2.2 注册表值的读 62
5.2.3 注册表值的写 65
第6章 时间与线程 67
6.1 时间与定时器 68
6.1.1 获得当前滴答数 68
6.1.2 获得当前系统时间 69
6.1.3 使用定时器 70
6.2 线程与事件 73
6.2.1 使用系统线程 73
6.2.2 在线程中睡眠 75
6.2.3 使用同步事件 76
第7章 驱动、设备与请求 79
7.1 驱动与设备 80
7.1.1 驱动入口与驱动对象 80
7.1.2 分发函数和卸载函数 80
7.1.3 设备与符号链接 82
7.1.4 设备的安全创建 83
7.1.5 设备与符号链接的用户相关性 85
7.2 请求处理 86
7.2.1 IRP与IO_STACK_LOCATION 86
7.2.2 打开与关闭请求的处理 88
7.2.3 应用层信息传入 89
7.2.4 驱动层信息传出 91
探索篇 研究内核
本书的第三部分，开始探索Windows内核程序，并尝试阅读反汇编代码作为指引。本部分包括第8~10章。如果读者对Windows内核编程已经有一定的了解，这一部分会比较有趣；如果读者从未接触过Windows内核编程，读者应该先学习第二部分。能自己编写内核程序并不意味着可以读懂内核，虽然反过来是一定成立的。读懂别人编写的没有代码的程序，比自己编写更困难一些，但的确是值得的。
第8章 进入Windows内核 96
8.1 开始Windows内核编程 97
8.1.1 内核编程的环境准备 97
8.1.2 用C语言写一个内核程序 99
8.2 学习用WinDbg进行调试 102
8.2.1 软件的准备 102
8.2.2 设置Windows XP调试执行 103
8.2.3 设置VMWare虚拟机调试 104
8.2.4 设置被调试机为Vista的情况 105
8.2.5 设置Windows内核符号表 106
8.2.6 调试例子diskperf 106
8.3 认识内核代码函数调用方式 107
8.4 尝试反写C内核代码 111
8.5 如何在代码中寻找需要的信息 113
第9章 用C++编写的内核程序 117
9.1 用C++开发内核程序 118
9.1.1 建立一个C++的内核工程 118
9.1.2 使用C接口标准声明 119
9.1.3 使用类静态成员函数 120
9.1.4 实现new操作符 121
9.2 开始阅读一个反汇编的类 122
9.2.1 new操作符的实现 122
9.2.2 构造函数的实现 124
9.3 了解更多的C++特性 126
第10章 继续探索Windows内核 131
10.1 探索Windows已有内核调用 132
10.2 自己实现XP的新调用 135
10.2.1 对照调试结果和数据结构 135
10.2.2 写出C语言的对应代码 137
10.3 没有符号表的情况 138
10.4 64位操作系统下的情况 141
10.4.1 分析64位操作系统的调用 143
10.4.2 深入了解64位内核调用参数传递 145
深入篇 修改内核
这是本书的第四部分。读者已经尝试过探索Windows内核程序，并尝试阅读反汇编代码。那么接下来，必须掌握修改内核的方法。每一个Windows内核程序，都可以看做Windows内核本身的一个“补丁”。有时只需要独立存在，就能起到它的作用；有时却必须对已有的内核二进制代码进行部分修改。本部分包括第11~13章，主要介绍的是内核Hook。
第11章 机器码与反汇编引擎 150
11.1 了解Intel的机器码 151
11.1.1 可执行指令与数据 151
11.1.2 单条指令的组成 152
11.1.3 MOD-REG-R/M的组成 155
11.1.4 其他的组成部分 157
11.2 反汇编引擎XDE32基本数据结构 159
11.3 反汇编引擎XDE32具体实现 162
第12章 CPU权限级与分页机制 166
12.1 Ring0和Ring3权限级 167
12.2 保护模式下的分页内存保护 169
12.3 分页内存不可执行保护 172
12.3.1 不可执行保护原理 172
12.3.2 不可执行保护的漏洞 173
12.4 权限级别的切换 177
12.4.1 调用门及其漏洞 178
12.4.2 sysenter和sysexit指令 181
第13章 开发Windows内核Hook 186
13.1 XP下Hook系统调用IoCallDriver 187
13.2 Vista下IofCallDriver的跟踪 189
13.3 Vista下inline hook 193
13.3.1 写入跳转指令并拷贝代码 193
13.3.2 实现中继函数 196
实战篇 实际开发
实战部分是本书最深入和复杂的一部分，包括第14～17章。为了让前面练习的成果，在实际应用中产生价值，在这部分我们补充更多的理论知识并尝试用它们去做一点什么。这一部分包括指令分析、硬件基础知识、内核Hook的实际开发练习，以及将完成一个用到内核Hook的有趣的实例，这个实例有助于计算机阻挡各种病毒和木马的侵袭。 
此外，本部分还包括特殊的一章，涉及如何巧妙地编写代码，来防止被其他不受欢迎的读者阅读。这与本书的主旨完全相反，正所谓物极必反。
第14章 反病毒、木马实例开发 200
14.1 反病毒、木马的设想 201
14.2 开发内核驱动 204
14.2.1 在内核中检查可执行文件 204
14.2.2 在内核中生成设备接口 208
14.2.3 在内核中等待监控进程的响应 210
14.3 开发监控进程 216
14.4 本软件进一步展望 218
第15章 Rootkit与HIPS 220
15.1 Rootkit为何很重要 222
15.2 Rootkit如何逃过检测 224
15.3 HIPS如何检测Rootkit 234
第16章 手写指令保护代码 237
16.1 混淆字符串 238
16.2 隐藏内核函数 244
16.3 混淆流程与数据操作 251
16.3.1 混淆函数出口 251
16.3.2 插入有意义的花指令 253
第17章 用VMProtect保护代码 258
17.1 安装VMProtect 259
17.2 使用VMProtect 261
17.3 查看VMProtect效果 267
参考文献 270
样章节选
上机建立第一个工程
一条指令可能有很多细节，比如第二个操作数和第一个操作数中，哪个只能是寄存器，哪个不能用寄存器加立即数等。如果要用手写汇编语言来开发一个软件的话，这些知识很重要。但是实际上，现在需要的是用C语言或者更高级的语言进行开发，只是需要理解一些没有C代码的部分。读者可以认为，那些代码的汇编指令用法一定是正确的，因为它们是编译器生成的。
1.2节（简要复习常用的汇编指令）将简要地回顾那些指令，并保证这些回顾非常容易理解。
1.1.1 用Visual Studio创建工程
建议读者的计算机中操作系统的版本最好是Windows XP或者更高的版本，使用Vista问题也不大，虽然可能操作细节和界面与本书描述的情况稍有不同。然后，请安装某个版本的Visual Studio，推荐Visual Studio 2003或者更高的版本。下面的描述同时顾及Visual Studio 2003和Visual Studio 2005的情况，语言版本为英文。
下面的步骤将在Visual Studio上建立一个用于实验的工程。有经验的读者可以忽略下面的描述。
打开Microsoft Visual Studio 2005，选择主菜单“File”。
选择子菜单“New”下面的“Project”，打开“New Project”对话框。
左边选择Visual C++，Win32；右边选择Win32 Console Application；下面输入一个工程名，然后单击“OK”按钮，出现向导。一切都选择默认设置，最后单击“Finish”按钮。
此时新建立工程的主文件是一个扩展名为.cpp的文件，请将它改为扩展名为.c的文件。
Windows底层代码基本上都是用C语言编写的，研究C语言和汇编指令的关系是本节的任务。为此，这个文件必须改变为扩展名为.c的文件，这样VC才会自动以C语言的方式进行编译。本书后面专门有一章的内容来研究C++下的反汇编阅读（第5章 用C++编写的内核程序）。
如果读者使用的是Visual Studio 2005，直接在左边的Solution Explorer中用鼠标右键单击文件YourProjectName.cpp，选择“Rename”，然后把.cpp改为.c即可。
如果是更老的Visual Studio版本，请单击右键，Remove这个文件。然后在外面改名，再对工程单击右键，选择“Add”，再选择“Exist Item”，追加进来。
此时程序是这样的：
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}