您的位置:首页 > 其它

第三章 内核对象

2014-11-09 22:18 323 查看
一、内核对象

        1、每个内核对象都是一片儿内存(数据结构),由系统内核分配与访问。

        2、令牌对象,事件对象,进程对象,信号量对象,线程对象等都是内核对象。

        3、内核对象有安全限制,在创建之初就需要传入一个结构SECURITY_ATTRIBUTES的安全描述符

        4、类似的还有用户对象和GDI对象等等,它们的创建函数就不需要一个“安全描述符”参数。

        注:相关API Create*

二、内核对象--句柄

        1、内核对象是属于系统内核的,可以被很多进程使用。

        2、进程维持了一个内核对象表,内核对象表的结构为:索引(句柄),指针(内核对象指针),访问掩码....

        3、进程中通过句柄来操作内核对象,用完以后需要调用CloseHandle来关闭内核对象,但是系统内核可

              能没有释放内核对象,仅仅是将这个内核对象的计数减一了,因为有可能其他进程在使用。

        注:有一个工具可以查看进程中的内核对象(Process Explorer)

[b]三、内核对象的传递[/b]

        继承:子进程复制父进程能被继承的句柄,此时句柄值相同,

                    内核对象计数加一。(CreateProcess有参数设置)

        环境块继承:环境块是可以被继承的,因此父进程只需要把句柄值写进环境变量中就可以了。(不安全的)

        消息:父进程可以通过给子进程发消息来传递句柄。(不安全的)

        调用:DuplicateHandle 将A进程的s句柄复制给B进程。(安全的)

        名字:使用名字来调用。

[b]四、内核对象的命名[/b]

        1、可以为内核对象命名,这样其他进程可以通过名字打开一个已有的内核对象,

              或者创建时如有已存在这个名字的内核对象,则变为打开这个句柄对象了。

        2、如果在服务器,或者远程桌面等功能上,很有可能多个终端所使用的内核对象名称一样,

              造成了混乱,此时就需要命名空间了。

             Global (全局命名空间) 用于公用服务器端内核对象,Local(本地命名空间)用于终端专有内核对象。

        3、另一种内核对象命名安全机制孕育而生:

              专有命名空间针对专有用户创建类似(Global,Local)等命名空间的 专有命名空间,这样确保只有特权用

              户才能使用专有命名空间。

              a.先创建边界CreateBoundaryDescriptor

              b.再创建安全描述符(SID)CreateWellKnownSid

              c.然后将SID插入边界中 AddSIDToBoundaryDescriptor
              d.最后调用 CreatePrivateNamespace 创建专有命名空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: