能力值:
( LV2,RANK:10 )
2 楼
鱼C论坛小甲鱼老师写在前面的话
有人说,学习编程的过程像极了武侠小说中武功的修炼。先是一招一式的学套路,逐步修炼内功心法,然后迈入武林,在自身的实践中逐渐领悟出习武的真谛。编程语言是基本的套路,不同门派的套路尽然不同。而数据结构,算法,微机原理,操作系统,内核开发则是内功心法。学套路不学内功,那只不过是花拳绣腿,学内功不学套路,则无处施展。
非常感谢谭文邀请我写几句。由于编写课件的需要,早在几年前就先后拜读过谭文的《天书夜读—从汇编语言到Windows内核编程》和《寒江独钓—Windows内核安全编程》。书中很多案例我都觉得很合适,都直接搬到教学当中。记得论坛上很多网友问我,学习完基本的编程语言之后,应该学习哪些内容呢?谭文的这两本书都在我的推荐书单中。只可惜后来他们告诉我这两本书已经不再继续出版了,甚是遗憾!当然,今天我能够在这里写这个序言,正是因为谭文跟我说,他将《天书夜读2》和《寒江独钓2》合并为本书:《Windows内核安全与驱动开发》
Windows内核安全与驱动开发的话题,通常都被认为是只有高手中的高手才会涉及的领域,甚至很多程序员都觉得Windows内核程序是非常神秘的东西。其实不难理解,由于大环境的影响,国内这方面的资料确实是寥寥无几,而真正优秀的书籍更是凤毛麟角。
谭文在现实中一直忙于各种各样的项目,每个项目都经历了“实现核心->功能开发->测试”这个过程,所以该书也是难能可贵地记录了作者的这些实战经验。本书中的案例并不是像很多学院派书籍一般,挖空心思的为一个知识点。
本书属于内功心法的学习范畴,其中的案例涉及病毒实时检测、防火墙、入侵检测、数据保护还原、数据即时备份、数据加密、数据防止泄密、反外挂等。推荐有C语言和汇编基础的朋友进行学习。本书还细心的为每个章节准备好练习题,通过这些练习,你可以迅速地进行自我检查并发现学习中的遗漏。
最后需要说的是,本书并非只是将《天书夜读2》和《寒江独钓2》单纯的进行合并出版。实质本书增加了不少新的知识,让读者从X86内核可以很好的过渡到时下流行的X64内核开发中。
能力值:
( LV2,RANK:10 )
3 楼
《寒江独钓》 旧版序
大约在半年年前,谭文就和我谈过想写一本既能深刻介绍Windows内核架构,又能结合具体Windows驱动程序开发实例的书。那时候他的《天书夜读——从汇编语言到Windows内核编程》已经出版,《天书夜读》所涉及的内容很广,但就如同书名一样,它的内容不太适合刚刚涉猎Windows内核编程的程序员,反而更像一本供黑客学习的读物。书中翔实地介绍了很多反汇编的实战技巧,非常的精辟,但对于新手来说,容易对Windows内核编程产生畏惧感。
当我第一次读完《寒江独钓——Windows内核安全编程》的初稿时,我觉得本书非常适合Windows内核程序的入门。Windows内核程序一直被认为是只有高手才能涉及的领域,很多程序员对这种开发都觉得非常神秘。我觉得这是一种错觉,其中有一个很重要的原因就是国内很少出版这方面的书籍。这本书很好地弥补了这方面的空白,我相信大部分读者读完本书后,都会觉得Windows内核开发程序不再那么神秘。的确,微软自从Windows 2000版本以后,内核的架构变化不是很大。当然,这并不意味着你读完本书后,你就可以对内核开发游刃有余了,这需要你对每一个细节反复研究,并且多做试验。
编写Windows内核程序,就意味着这个程序可以执行任意指令,可以访问计算机所有的软件、硬件资源。因此,稍有不慎就有可能将系统变得不稳定。Windows的设计者设计了各种驱动模型或者框架,如NT式内核驱动模型、WDM框架和新推出的WDF框架。在这些模型框架下编程,就使内核编程变得简单,同样也降低了内核程序崩溃的机会。其实,Windows驱动程序员和黑客都在写内核程序,唯一不同的是驱动程序员按照微软设计的模型写程序,而黑客可以不按照这些框架写。Windows设计的这些框架,可以将操作系统的原理隐藏起来,只暴露一些接口,驱动程序员只要把这些接口写好就可以了。从这个角度看,驱动开发并不难,尤其是读完本书后,更会觉得不难了。但是想完成一些特殊的功能,如内核级隐藏进程等,Windows的这些框架就没什么用处了,程序员就需要对Windows内核有全面的了解,通过直接修改Windows内核来实现这些目的。往往黑客对这种技术乐此不疲,通过修改Windows内核,你会发现你的程序几乎无所不能。
编写内核程序是一件很痛苦的事情,回想起这些年学习内核程序开发的经历,真是感慨万千。就如同谭文所说:编写内核程序的人从某种程度讲是孤独的。当一个经验并不丰富的小程序员面对庞大复杂的并且不开源的Windows框架时,那是一种怎样的无助感啊!谭文是我比较钦佩的程序员之一,他对技术非常执着,并且精力充沛。内核程序的知识涉及面非常广,不同类别的内核程序差别也特别大,他几乎都有所涉猎。相信读者在读完这本书后,能对Windows内核开发有比较详细的了解,同时也能结合书中的实例写出很优秀的内核程序了。
张 帆
2009年5月1日于北京
能力值:
( LV2,RANK:10 )
4 楼
第1章 内核上机指导
请注意,因为大部分Windows驱动程序都是内核驱动(Kernel Driver),所以本书中,不区分“驱动编程”与“内核编程”。同时,也不区分“内核模块”(Kernel Module)与“驱动程序”(Driver),这两个词汇都指本书中编译出的扩展名为“.sys”的可执行文件。
但是本书和一般“驱动开发”书籍不同的是,本书专注于较通用的内核程序的开发,并不介绍针对某种硬件,比如声卡、显卡、USB等的各种驱动程序的开发。
本书的许多内容涉及到各种不同的内核驱动程序,比如文件系统驱动(File System Driver)、存储设备驱动(Storage Driver)及网络驱动(Network Driver)。但是开发目的,并不是为了驱动某个硬件,而是在通用的Windows上实现某种功能。
Windows上内核(Kernel Model)编程和用户(User Model)应用编程有很多不同的地方。初次学习,很多读者会关心如何开始动手实践。为此本章专门讲述如何在Windows的PC上,下载和安装必要的工具,并动手开始内核编程。值得庆幸的是,在Windows上进行内核编程、编译、调试、安装、显示调试信息的全部必要工具(不包括为了编程方便而使用的Visual Studio),都是免费的,因此任何读者都可以在不花费任何金钱的情况下开始学习这一章节。
对实际上机暂时没有兴趣,或者已经做过驱动开发的读者,则可以跳过第1章。
上传的附件:
能力值:
( LV2,RANK:10 )
5 楼
1.1 下载和使用WDK
1.1.1 下载安装WDK
就像应用程序使用开发包SDK一样,内核编程使用“Windows Driver Kit”,简称WDK。WDK已经自带所有需要的头文件、库、C/C++语言及汇编语言的编译器与连接器,所以完全可以在不安装Visual Studio的情况下进行编程。只是工程管理会不太方便,读者可以使用记事本或者自己喜欢的其他文本编辑器进行编程。习惯使用Visual Studio的读者会感觉这很酷,因为只有传说中的骨灰级程序员才使用记事本编程。
建议读者下载一个能显示行号的文本编辑器。以便出现编译错误时能迅速找到错误。Linux爱好者当然可以直接用vim。
有些读者可能听说过DDK或者IFSDDK,但是那已经是历史了,请遗忘它。同时下面的描述也可能成为历史,所以请读者进入主页后应该随机应变。
首先请打开网页:
https://connect.microsoft.com/default.aspx
这个网页必须先登录。登录拦住了不少访客,有些访问者会以为是收费注册的,其实使用Windows Live账号就可以登录(即用MSN账号登录)。如果没有MSN账号,可以去免费注册一个。
有了Live账号之后,还必须用这个账号向Connect注册,才能下载WDK。用Live账号登录之后,下面出现“立即注册Connect!”链接。
注册很简单,只要填写名字、地区和邮箱就可以了。虽然要填写邮箱,但是笔者并没有去打开发送到邮箱中的文件,这个ID就直接可以下载了。笔者不确定是否真的如此,请读者自己尝试一下。
登录之后出现一个“配置控制面板”页面,但是笔者没有使用它,单击上面的“主页”链接,回到主页,能看见显示自己已经登录了。大致画面如图1-1所示。
请单击图中用圈圈住的“查看所有站点”。
下面就比较简单了,左边会显示类别,在类别中请选择“开发人员工具”。选择之后右边就有“Windows Driver Kit”可以下载,请按网页的提示逐步下载即可。这个开发包非常大,下载之后有几GB的内容。(注:最新版本的WDK已经缩减,只有几百兆了。)下载WDK之前请先根据此时页面的提示下载并安装FTM(File Transfer Manager),可以大大加快下载速度。
安装过程没有需要特别注意的地方,只有两点:
(1)安装到一个简单一点的路径,避免在特殊情况下需要配置路径时麻烦,比如C:\WinDDK。尤其要避免在路径上有空格,否则可能出现编译问题。
(2)一定要选择“完全安装”,否则可能错过一些代码例子。
上传的附件:
能力值:
( LV3,RANK:30 )
6 楼
谢谢分享,但是没有内容啊
能力值:
( LV5,RANK:60 )
7 楼
坐个沙发:)
能力值:
( LV2,RANK:10 )
8 楼
正在整理,陆续上试读内容哈
能力值:
( LV2,RANK:10 )
9 楼
1.1.2 编写第一个C文件
现在请打开记事本(或者读者喜欢的任何工具)来创建一个文件,我们把这个文件命名为first.c,以表示这是我们编写的第一个内核编程文件。在进行内核编程时,读者必须打开WDK的帮助。在WDK安装之后,单击“开始”菜单→“所有程序”,会发现增加了“Windows Driver Kits”和“Windows Driver Kits Documentation”两个子菜单。(注:最新版本这两个菜单已经合并为一个。)
选择“Windows Driver Kits Documentation”下面的子菜单来打开帮助。在使用任何一个函数之前,请在帮助里查询这个函数是否存在、使用的环境要求及输入/输出。
因为这不是应用程序编程,所以所有的Win32 API函数都不能使用;部分C Runtime函数也不能使用,但是文档中说明的函数则都可以使用。本书将在文档中有说明的且在内核下调用的System Routine称为内核API函数,以便和Win32 API函数区分。
我们编写first.c内容如下:
///
/// @file first.c
/// @author crazy_chu
/// @date2008-11-1
///
#include <ntddk.h>
// 提供一个Unload函数只是为了让这个程序能动态卸载,方便调试
VOID DriverUnload(PDRIVER_OBJECT driver)
{
// 但是实际上我们什么都不做,只打印一句话
DbgPrint("first: Our driver is unloading…\r\n");
}
// DriverEntry,入口函数。相当于main。
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
// 这是内核模块的入口,可以在这里写入我们想写的东西
// 笔者在这里打印一句话。因为“Hello,world”常常被高手耻笑,所以
// 打印一点别的
DbgPrint("first: Hello, my salary!");
// 设置一个卸载函数,便于这个函数退出
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
上面的DriverEntry是每个内核模块的入口,在加载这个模块时被系统进程System调用一次。在其中我们设置了DriverUnload的函数指针,这样这个模块可以被动态地卸载(这将方便我们调试程序);如果没有设置DriverUnload函数指针,则一个内核模块一旦被加载就不能卸载了。
现在请先建立新目录first,然后把first.c文件保存在此目录下,下面我们就介绍编译的方法。
能力值:
( LV2,RANK:10 )
10 楼
1.1.3 编译一个工程
前面已经建立了工程first,虽然这个工程只有一个first.c文件作为代码文件。现在必须在这个目录下增加两个文件,以便WDK的build工具可以build它。其中一个文件的名字必须为makefile,这个文件的内容很无聊,永远也不需要改动,内容如下:
!IF 0
Copyright (C) Microsoft Corporation, 1999 - 2002
Module Name:
makefile.
Notes:
DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
file to this component. This file merely indirects to the real make file that is
shared by all the components of Windows NT (DDK)
!ENDIF
!INCLUDE $(NTMAKEENV)\makefile.def
如果读者不想自己写这个文件,那么请到WDK的src目录下随便寻找一个例子,然后拷贝一个出来。大部分例子的makefile都和这个一样。
另外,还需要一个名字为SOURCES的文件,这个文件的内容关系到这个模块要编译哪些文件,以及编译出来的.sys文件的名字。举例内容如下:
TARGETNAME=first
TARGETTYPE=DRIVER
SOURCES=first.c
其中TARGETNAME表示名字,编译出来之后,模块的名字为first.sys;SOURCES表示要编译的.c文件(对于初学者,必须提醒一点,不要加入.h文件,因为.h是被包含在.c文件中编译的),如果.c文件有多个,请用空格分隔。
下面请从“开始”菜单中打开WDK的build环境配置,如图1-2所示。
从“开始”菜单中选择“所有程序”,然后选择“Windows Driver Kits”→WDK的版本(这里“WDK 6001 18001”)→“Build Enviroments”→“Windows XP”→“Launch Windows XP x86 Checked Build Enviroment”。
出现一个控制台,这个控制台已经配置好编译环境。现在输入cd命令,进入我们先前建立的first目录;进入之后,输入build命令。笔者这里编译的结果如图1-3所示。
现在编译结束,first.sys出现在\first\objchk_wxp_x86\i386下。这个文件并不像普通exe文件一样可以直接双击执行,它需要一个安装工具进行安装。下面讲解如何安装并运行它。
上传的附件:
能力值:
( LV2,RANK:10 )
11 楼
SOURCES表示要编译的.c文件,这句话是错的
能力值:
( LV2,RANK:10 )
12 楼
试读这么发,是不是太乱了?
能力值:
( LV4,RANK:40 )
13 楼
还是PDF比较直观一些呐。
鱼C论坛 小甲鱼已经发过PDF链接了。。 http://pan.baidu.com/s/1pJ6vQaB
能力值:
( LV2,RANK:10 )
14 楼
博文观点又来抢我的最后一年压岁钱了。。。
能力值:
( LV2,RANK:10 )
15 楼
我上传了PDF的试读,大家去下载吧
能力值:
( LV2,RANK:10 )
16 楼
看起来舒服多了~~~~~~~~~~~~~
能力值:
( LV2,RANK:10 )
17 楼
沙发,感谢分享。
能力值:
( LV2,RANK:10 )
18 楼
《Windows内核安全与驱动开发》具体什么时间出版啊
能力值:
( LV2,RANK:10 )
19 楼
出版后请发个帖~第一时间购买收藏哈哈
能力值:
( LV8,RANK:120 )
20 楼
看来wowocock说的没错啊,老狂灰常“爱”出书!
能力值:
( LV2,RANK:10 )
21 楼
什么时候会上市?
能力值:
( LV2,RANK:10 )
22 楼
感觉还不错,坐等出版
能力值:
( LV2,RANK:10 )
23 楼
看看 了解一下 感谢分享
能力值:
( LV8,RANK:120 )
24 楼
一本书6位作者
能力值:
( LV2,RANK:10 )
25 楼
希望本书能尽快出版。