句柄表
前言
因为创建进程的时候提到了PROCESS_INFORMATION
这个结构体
这个结构体里面存在两个值,一个是句柄一个是id
什么是句柄?什么是id?就得深入学习句柄表了
0x01. 什么是内核对象?
像进程、线程、文件、互斥体、事件等在内核中都有一个对应的结构体,由内核负责管理。我们管这样的对象叫做内核对象
0x02. 如何管理内核对象
比如说我们创建了一个进程,如何内核层,也就是0环那边给了 EPROCESS 结构体
然后我们在这个进程内 再创建 进程,线程,事件,文件,然后又分别分配了各自的内核结构
0x03. 每个进程都有一个句柄表
在0环中有个EPROCESS结构体,结构体里面有个指针,指向了句柄表,我们创建了之后会在EPROCESS结构体中的句柄表写入地址
然后我们想用A的时候,就输入1,我们想用B的话就输入2,这就是句柄
注意:不是每个内核对象都有表的,只有内核对象有句柄表,简单的说,只有EPROCESS
这个才有
0x04.多进程共享一个内核对象
A进程通过CreateProcess创建了一个进程,B进程通过OpenProcess打开别人创建好的进程
两个进程用的是同一个内核对象,A进程中有个句柄表,然后A内核对象索引为 1,就可以索引使用,C进程也是通过句柄表的值
如果再有创建,那么A内核对象计数器会 加 1;CloseHandle其实就是减计数器,当计数器为0的时候就减小了
注意:句柄表是私有的
0x05. 句柄是否“可以”被继承
微软除了使用上面那个方式共享内核对象,还可以使用另外一种方式进行共享
实际上句柄表有三列,而这还有一列是代表着是否可以被继承
从这边可以知道子进程可以继承父进程的句柄表,但并不是句柄表全部都能继承,而是允许继承的才会继承
这边就可以知道 索引为 2和4 的可以被继承,当不被继承的时候,就会在子进程填0