您的位置:首页 > 其它

《寒江独钓》的作者教您如何高效阅读本书

2009-06-04 14:24 387 查看
阅读注意

如何阅读本书

本文节选自《寒江独钓:Windows内核安全编程》一书
请注意,本书基本上不可以跳读。虽然书中的内容是按照应用的领域进行划分,但是并没有采用一种分类介绍所有基础知识,然后分各个领域介绍的模式。而是从简单的应用到复杂的应用依次进行的。

本书首先最简单地介绍了串口的过滤,然后是键盘的过滤(用于密码保护)。先介绍这些内容是因为它们在驱动中最简单。但是并不是意味着只关心网络过滤的读者,可以跳过它们,直接翻到NDIS中间层驱动的章节进行阅读。

本书所有的章节内容,采用的都是基于WDK的C语言编程。在编程方法上是统一而且一脉相承的。对于所有的内核API函数的介绍、特殊名词、基础概念的说明,本书都是在具体范例中,第一次出现时做详细的介绍,并举出例子。而以后再出现时,就直接使用而不做介绍了。因此,要对后面介绍的复杂的内核模块的章节能顺利地阅读,必须以前面的简单的章节为基础。

书中的代码

书中及附带光盘中的代码,仅供学习与研究使用。这些代码有一部分是笔者所写,有一部分是修改或者直接引用了业内公开的、可供研究使用的代码。这些代码在笔者的测试环境下都可以正常运行。但是笔者并不保证这些代码都有相应的授权可以应用于商业开发中,也不保证这些代码在所有版本的Windows、与其他任何软件并存都能可靠运行。商业级的内核代码需要经过详尽的测试,本书中的示例代码并不具备这个过程。

读者在运行这些代码时,应该自己使用合理的安全手段(保存未保存的文件、使用虚拟机,或者在运行之前准备硬盘还原映像),以便万一系统损坏时可以恢复。至于具体的操作方法,请读者参考本书第1章“内核上机指导”。笔者对读者因为运行这些代码时发生的意外而导致的损失不负责任。

如果本书的读者将这些代码应用到商业软件开发中,由此所引发的一切后果(如版权上的侵犯和技术上的问题,以及相应造成的损失),本书的作者都不承担任何责任。

如果读者发现测试时某个示例程序无法运行,请做以下的事:

(1)在虚拟机上安装一个干净的Windows XP;不要安装任何其他软件。

(2)确保虚拟机模拟的是单核的CPU。

如果程序依然崩溃,请保留dump文件,并用E-mail联系本书的作者。

阅读前的准备

读者必须先准备编译和调试环境。内核编程的环境不像应用编程只需要安装一个软件那么简单。具体的方法在本书第1章有详细的介绍。

随书光盘上并没有提供运行、调试本书示例代码的完整工具集。这是因为有一部分软件的授权要求为“不得拷贝分发”,所以需要读者自己在网上下载。但是幸运的是,本书涉及的所有必要工具软件都是免费的,第1章中提供了相应的说明和下载的网址,下载的网址可能有时效性。同时由于工具软件版本的升级,这些说明可能和实际的情况有所不同,读者应该在网上搜索最新的信息。

关于本书读者所需要的基础知识,笔者认为应该精通C语言(汇编与C++是不必要的,本书只使用C语言编程),至少熟悉Windows下C语言的一种应用编程方式(比如使用过VC或者C++Builder)。如果从事过驱动开发,那是非常好的基础。但是本书尽量面向没有从事过驱动开发的读者。

操作系统、计算机网络、数据结构与算法的基础知识对于理解本书的内容很有帮助,完全没有学习过这方面知识的读者会难以理解书中的一些细节。

技术细节的说明

本书是由实际从业的程序员所写,总体而言,是实践而不是理论之书。所以和一些常见的编程技术类书籍不同,本书对一些具体的技术细节的描述可能不详细,比如对内核函数的参数使用的说明。一般来说,Windows的应用层API函数和内核API函数的参数都非常复杂,详细地说明它们需要较大的篇幅。但是更重要的是,在绝大多数情况下,使用的参数组合仅仅是常见的几种。本书以笔者实际的编程经验,详细介绍在开发中实际使用的参数配置;而对于笔者从未使用或者极少使用的情况,则往往以“笔者也从未使用过”进行说明。因为笔者认为,知道哪些细节有用,远比了解有哪些细节更加重要。所以读者应该理解这一点:本书提到的情况,往往是必须掌握的;而本书未提及的情况,则往往是很不常用的。如果需要用到的细节本书没有提供,大部分都可以在帮助文档中查到。

与应用编程不同,内核编程(尤其是信息安全软件涉及的内核编程)总有部分技术点没有文档可循,有时虽然有文档,也语焉不详。有些问题,笔者也并没有搞清其原因,但是在实际开发中却是必须解决的,因此很有可能是通过经验解决。为此,书中虽然说“请务必这样做”,或者说“笔者是这样做的”,但是并不能详尽地说出原因。如果有读者对某个问题有更深入的了解,敬请与笔者联络,以便在重印或再版时加入更明确的说明。

词汇的翻译

在这个行业中有太多词汇来源于英文文档,因此如何翻译为中文是一个难题。一般地说,应当沿用业界最常用的翻译方式。但是由于笔者所读过的翻译书籍毕竟有限,不大可能使各个词汇都符合业界最标准的翻译方式。为了稳妥起见,那些重要的、可能引起疑惑的词汇在本书正文第一次出现时,都使用“中文(英文)”的方式。

有少数词汇是笔者在阅读前人的书籍时,曾经深感疑惑的。为了浅显起见,有意地使用了本人自认为更浅显的翻译方式。最典型的就是“System Routine”,所有在WDK中提供的开发者可以调用的函数(类似于SDK中提供的API函数)都称为“System Routine”。笔者见过以前的书中翻译为“系统例程”。既然它就是一个函数,笔者倒是觉得翻译为“内核API”或者“内核函数”,对于习惯应用程序编程的读者会更好理解。同理,“Dispatch Routine”也被笔者翻译成了“分发函数”。读者如果认为有不妥或者错误的地方,敬请批评指正,以便在重印或再版时修改。

驱动开发模型的选择

WDF是Windows驱动编程模型的发展趋势,但是传统的NT式驱动、WDM模型依然是理解驱动开发的基础。目前,完全抛弃传统是不可能的。一方面,传统的模型编写的驱动程序依然有效,而且有大量现成的例子可以参考;另一方面,WDF虽然已经出来很久了,但是有许多的基础例子找不到WDF的范本。很多无处不用的驱动程序是人类经过多久都不愿意去重新开发的,虽然微软把大部分旧的驱动程序的例子改为了WDF模型,并在WDK中和旧例子一起提供给开发者参考,全面取代WDM的时代依然没有到来。这个过程还有赖于WDF自身的进一步完善。

如何区分驱动模型?下面是本书第2章中的一段:

“Windows的模型概念,本来是就驱动程序的行为而言的。比如WDM驱动,必须要满足提供n种被要求的特性(如电源管理、即插即用)才被称为WDM驱动。但是如果不提供这些功能,那么统一称为NT式驱动。

本书采用简单的区分方法。将一切在Windows 2000~Windows Vista下能正常运作且未调用WDF相关的内核API函数的驱动都称为传统型驱动(包括NT式和WDM)。如果调用了WDF相关的内核API则称为WDF驱动。

从目前笔者的理解来看,WDF的编程方式是对已有的在WDM中广泛使用的内核API函数的一次封装,尤其是对以Io开头的系列函数,包括驱动对象(Driver Object)、设备对象(Device Object)、和请求(IRP)相关的API进行了封装,而且旧的API完全可以调用。已经有太多的内核程序依赖于旧的接口,微软在很长一段时间内都不可能要求只能使用WDF编程。

因此本书采用二者并重的方式。大部分例子用传统型驱动方式编码,另一些例子则使用WDF的方式编码(虚拟磁盘与虚拟网卡)。读者会发现这二者之间一脉相承,只要熟练掌握传统型的编程方法,了解WDF会是非常轻松和愉快的过程。

本书的习题

有些读者不喜欢用习题来练习的方式,他们认为“这只是一些知识性的东西,记下来是浪费大脑的空间”或者“这些东西在需要的时候再去查阅资料就可以了”等。确实,有许多细节是不需要去记忆的。对一个程序员来说,最重要的就是在需求产生、得到问题时,明白应该从哪里入手去解决这个问题。这就要有一些在大脑中已经建立的概念。如果是处在完全蒙昧无知的状态下,那么就算把整个图书馆都摆在面前,也完全没有意义。

本书每章后都附有少量的习题,这些习题的目的在于让读者自我检查,读完一章后是否已经建立了正确的概念。此外,还有一些常识性的习题(比如指令int 3的意义是什么),是会对读者在进行实际工作时有很大帮助的,建议读者不要忽略。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: