• win7 x86中ObReferenceObjectByHandle对内核句柄和用户句柄的处理


    内核句柄和用户句柄

    内核句柄的值有KERNEL_HANDLE_MASK标识(小于0),用户句柄的值没有KERNEL_HANDLE_MASK(大于0)。

    ObReferenceObjectByHandle

    当句柄值不含有KERNEL_HANDLE_MASK标志时(用户句柄)

    当句柄值为-1或-2时

    当句柄值含有KERNEL_HANDLE_MASK标志时(内核句柄)

    内核中使用ObReferenceObjectByHandle获取Object

    在内核中利用3环的handle来获取Object(AccessMode == UserMode)

    ObReferenceObject在执行到SuccessToHandleTable后,通过调用ExMapHandleToPointerEx函数来得到对应的Object。
    ExMapHandleToPointerEx函数通过调用ExpLookupHandleTableEntry从句柄表HandleTable里寻找Object

    ExpLookupHandleTableEntry函数会清除Handle的属性位后,判断handle的值是否大于句柄表中最大的句柄值。

    到最后ExMapHandleToPointerEx就会返回,

    在内核中利用0环的handle(内核handle)来获取Object(AccessMode == KernelMode)

    以文件对象为例:利用文件对象名称获得对应的内核句柄,然后通过内核句柄获取对应的文件对象Object。

    IO_STATUS_BLOCK IoStatusBlock = { 0 };
    NTSTATUS Status;
    
    //通过对象名称,得到对象内核句柄
    InitializeObjectAttributes(
    	&TempObjectAttributes,
    	In_ObjectAttributes->ObjectName,
    	OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    	TempRootDirectory,
    	NULL
    	);
    
    Status = IoCreateFile(FileHandle,
    	GENERIC_READ | SYNCHRONIZE,
    	&TempObjectAttributes,
    	&IoStatusBlock,
    	0,
    	FILE_ATTRIBUTE_NORMAL,
    	FILE_SHARE_READ | FILE_SHARE_WRITE,
    	FILE_OPEN,
    	FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
    	0,
    	0,
    	CreateFileTypeNone,
    	0,
    	IO_NO_PARAMETER_CHECKING
    );
    
    
  • 相关阅读:
    HTML if条件注释解读
    Springboot整合logback日志系统
    Springboot @Valid 参数校验
    JDK1.8 版的if else
    Android获取手机定位坐标
    CentOS8安装JDK
    Vue全局配置文件
    git学习
    百度前端面试题—基础
    前端知识网络
  • 原文地址:https://www.cnblogs.com/revercc/p/15861832.html
Copyright © 2020-2023  润新知