《Windows核心编程》第三章,简要的介绍了内核对象的概念!主要内容包括几个方面:
1.内核对象的概念:
首先,win32中有众多以Create名称开头的函数(比如,CreateWindow等等),这些函数一般返回一个HANDLE类型的对象,这个对象可以表示:一个文件,一个线程~~~但是,究其本质他们都是一个内存块,我们称这些对象是内核对象(内核对象可以认为是HANDLE类型的,但是并不是HANDLE都是内核对象)。
内核对象有如下特点:
a.内核对象是一个数据结构,但是这个数据结构只能同过系统内核访问。应用程序虽然创建了内核对象,但是不能直接对他进行访问,必须通过WIN32的函数对他进行操作!
b.句柄(HANDLE)标识了内核对象,32位系统中handle是32位值,64位系统则是64位值。应用程序要通过函数操作内核对象时,需要向函数传递这个handle值。
c.内核对像可以通过某种方式在进程之间共享,因此当一个程序调用函数CloseHandle试图关闭内核对象时,只是取消了这个程序和这个内核对象的关联,并没有销毁内核对象。
内核对象的销毁由操作系统管理,系统使用计数的方式来管理内核对象。
2.内核对象的安全性
应用程序创建内核对象时,可以传递一个安全描述符(security descriptor SD)来保护内核对象(鄙人从来传递NULL)。
这个SD主要有三个方面的作用:描述该对象的拥有者,那些组和用户(比如管理员)能够访问对象,那些组和用户不能访问对象。(这些特性在普通XP系统下基本没有用,直到出现了Win7的以管理员身份运行!!!!否则,这些功能只有为服务器编程时才用的到!)
书中3.12提到结构SECURITY_ATTRIBUTES用来表示这个安全描述符,当为他传递NULL是表示默认安全性,同时也可初始化一个结构作为参数(P35,该结构中的一个数据可以设定该对象是否可继承,一个表示数据的长度,还有一个与安全性相关的指针没弄懂有什么用??)
判断一个对象是不是内核对象,我们可以判断他的Create函数是否含有这个安全描述符。
3.进程内核对象表
系统为每个进程分配的句柄表,这个表里只放内核对象的句柄,表里的项大概有这么几项,索引(这个索引书的作者说是内核对象句柄的实际值除以4,而且好像从1开始),指向内核对象内存块的指针,访问掩码,标志。一个内核对象只要在这个表中被标识,并且对程序而言是可访问的,那么不论是否这个对象是否由该程序创建,这个内核对象都是可用的!!因此,就提出了一个问题:如何在进程之间共享内核变量!!?
4.跨进程边界共享内核对象
一般的套路基本是这要的,程序A有一个内核对像要共享给程序B使用,那么程序A要做两件事:1.把内核对象的信息复制到程序B的内核对象表;2.把这个消息通知给程序,也就是把内核对象的句柄传递给B。
书里有好几种方法:
使用对象句柄继承:这种只用A是B的父进程的时候才可以使用,一般是在创建内核对象的时候把它指定为可继承的(同过安全描述的中的一个结构成员P42,这里又涉及到内核对象表中的标志,当标志是0的时候不可继承,1的时候表示是可继承的)。
接下来,如果A调用CreateProcess生儿子(进程B,还要设定bInheritHandles为TRUE),可继承的内核变量,就自动被复制到B的进程内核对象表里(而且复制的位置是一样的!!!说明,继承的内核对像的句柄值完全以一模一样)!!剩下的事,我们就就可以发消息什么的通知进程B:“你爹已经给你账户上打了500万,随便花吧!”
上面讲到内核对象的可继承性,可以通过安全描述符实现!其实,我们还可通过SetHandleInformation函数直接修改句柄的标志(P45),让他可继承,或者不可继承!
第二种共享内核对象的方法是内核对象命名:
到用Create函数创建内核变量时,有一个参数pszName来表示这个变量的名称,很遗憾我们一般传递NULL,那么我们这时创建的变量就是是所谓的匿名变量。如果我们,传一个TEXT(L“LQ”),那么系统就知道我们为我们的内核变量起名叫做LQ。Create函数有一个特性:如果现在又有一个程序,要创建一个类型相同的内核变量,起名也叫“LQ”,那么这个时候程序,不会再创建一个内核变量,而会把上一个程序创建的“LQ”,作为Create函数的返回,这样两个程序就共享了一个内核变量!!!(有时候,我们希望使用一个指定名字的内核变量,但是又能创建它,因此我们会使用Open函数代替Create函数)。
但是,上面的方法有一个问题,Windows下内核对象的命名空间是全局,我们指定对象的名字时,可能发生冲突!!(书里提出了一种黑客攻击的手段,什么DoS攻击!!!同时,服务器上运行的操作系统,有一点区别P50)。
为了解决这个问题,提出一个概念,叫做专有命名空间。
最后,共享方式是复制对象句柄
利用的函数是DuplicateHandle,原理大同小异!!!
最后,这一张有一个实例程序,关于管理员权限和私有对象命名空间的!!
293

被折叠的 条评论
为什么被折叠?



