三章 --- 内核对象

一,基础部分

1.内核对象和用户/GDI对象区别:创建内核对象的API一般都会有SECURITY_ATTRIBUTES参数

2.进程的句柄是作为进程句柄表的索引来使用(索引 = 句柄值 / 4),所以不同进程不能通过一个句柄值访问句柄

3.创建内核对象失败会返回0(NULL)句柄,这也是第一个有效句柄为4的原因

4.CloseHandle在关闭无效句柄时候在调试状况会抛出0xC0000008异常(可用于反调试)

5.句柄的标志可以用SetHandleInformation来修改,如果设置为HANDLE_FLAG_PROTECT_FROM_CLOSE,再用CloseHandle就会在调试器下产生异常(可用于反调试)

6.复制句柄时候句柄的索引不变,所以句柄值 = 索引*4不会变

7.句柄继承仅仅在生成子进程时候会发生,生成子进程后的进程不会再继承父进程的句柄

8.GetHandleInformation可以获取一个handle的句柄属性

二,跨进程使用内核对象

1.通过继承父进程,句柄从父进程继承到子进程,要CreateProcess带上bIneritHandle为TRUE

        子进程获取父进程句柄的三种方法:

        ①.通过CreateProcess带上命令行参数为句柄值(用_stscanf来分割)
        ②.等待子进程初始化完成(WaitForInputIdle),然后用进程间通信发送消息告知

        ③.父进程在环境块加入一环境变量,子进程继承环境变量,GetEnvironmentVariable

2.通过创建具名对象:

            如:CreateMutex , CreateEvent , CreateSemaphore , CreateWaitableTimer , CreateFileMapping , CreateFileMapping , CreateJobObject

                    CreateMutex如果已经存在了一个同名同类型的hMutext就会检查是否有相同的访问权限,如果有则会在进程句柄表中找一个空白处复制句柄值过去,并且GetLastError会返回ERROR_ALREADY_EXISTS,否则就会返回NULL

3.复制对象句柄:DuplicateHandle

    DulicateHandle会将原进程的句柄复制一份到目标进程,然后再将目标进程中的句柄值拷贝到第四个参数中。所以如果有三个进程ABC,C进程调用DuplicateHandle进行AB间句柄的复制:

DuplicateHandle(hprocessA , hObjA , hProcessB , phObjC , NULL , 0 , 0),这样就会将hObjA复制到phObjC中,并且会在B进程的进程句柄表中添加一个hObjA。

DuplicateHandle的最后一个参数如果设置为DUPLICATE_CLOSE_SOURCE,就会关闭原源进程中的句柄,这样内核的句柄计数就不会增加在复制完后






猜你喜欢

转载自blog.csdn.net/a893574301/article/details/80605855