• 句柄表


    前言

    因为创建进程的时候提到了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

  • 相关阅读:
    dblink
    linux 查进程、杀进程、起进程
    oracle 资源统计SQL语句
    DIV+CSS+javascript 手动轮播图
    接受同步数据接口
    java String StringBuffer StringBuilder
    SpringMVC Servlet 分页查询接收参数
    WPF 开发
    收集整理的各地精品青年旅舍大全(
    Linux平台Java调用so库JNI使用例子
  • 原文地址:https://www.cnblogs.com/0x7e/p/13820086.html
Copyright © 2020-2023  润新知