第三章 内核对象
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 创建专有命名空间
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 创建专有命名空间
相关文章推荐
- 【windows核心编程】 第三章 内核对象
- windows核心编程第三章--内核对象
- 第三章:内核对象
- 第三章 内核对象
- WINDOWS核心编程第三章内核对象的一点细节
- windows核心编程第三章阅读 内核对象
- Windows核心编程 第三章 内核对象
- Windows核心编程 第三章 内核对象
- WINDOWS核心编程--读书笔记:第三章 内核对象
- 第三章:内核对象
- 第三章 内核对象(1)
- windows核心编程第三章学习事件内核对象代码
- 【windows核心编程】 第三章 内核对象
- Windows核心编程学习笔记 第一部分 第三章 内核对象
- 第三章 内核对象(1)
- 读书笔记----《windows核心编程》第三章 内核对象1(句柄与安全性)
- 为什么CreateThread()调用创建线程时,系统设置线程内核对象的引用计数为1,在Create函数返回前是2
- 通过内核对象在服务程序和桌面程序之间通信的小问题
- Windows进程同步之事件内核对象(Event)
- Windows内核对象头部结构