• 内核对象


    1.    定义: 内核对象通过API来创建,每个内核对象是一个数据结构,它对应一块内存,由操作系统内核分配,并且只能由操作系统内核访问。在此数据结构中少数成员如安全描述符和使用计数是所有对象都有的,但其他大多数成员都是不同类型的对象特有的。内核对象的数据结构只能由操作系统提供的API访问,应用程序在内存中不能访问。调用创建内核对象的函数后,该函数会返回一个句柄,它标识了所创建的对象。它可以由进程的任何线程使用。在32位系统中,句柄是一个32位值。64位系统中则是64位值。
    2.    常见对象 : 进程、线程、文件,存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象,邮件槽对象,信号对象和线程池工厂对象
    3.    通用内核对象成员: 计数. 系统内核通过计数知道该内核对象被多少进程使用.  开始创建时值为1,每另一个进程获得该对象的访问后计数++,否则计数--. 当计数为0时系统自动销毁该对象
    4.    通用内核对象成员: 安全描述符. . 权限问题: A security descriptor describes who owns the object (usually its creator), which group and users can gain access to or use the object, and which group  and users are denied access to the object.
    typedef struct _SECURITY_ATTRIBUTES {
    DWORD nLength;
    LPVOID lpSecurityDescriptor;
    BOOL bInheritHandle;
    } SECURITY_ATTRIBUTES; 重点是第2个参数.与安全相关. 第一个参数时该结构大小直接sizeof. 
    访问函数的访问方式权限过高可能导致拒绝访问.  
    判断一个对象是否是内核对象就看创建对象的函数有没有能指定安全描述符的参数.
    5.    进程内核对象专有成员: 句柄表it is simply an array of data structures. Each structure contains a pointer to a kernel object, an access mask, and some flags.
    6.    创建内核对象.通过创建函数创建. 如创建线程,进程,文件.
    7.    关闭内核对象: BOOL CloseHandle(HANDLE hobject);调用该函数的进程无法访问该内核对象,但该内核对象不一定被销毁,因为计数不一定是0
    8.    对象句柄继承. 安全描述符第3个参数为1. 然后该进程创建子进程函数中bInheritHandles,参数为1
    9.    改变句柄标志BOOL SetHandleInformation(HANDLE hObject, DWORD dwMask, DWORD dwFlags);
    10.    为内核对象命名: 创建对象函数的pszName参数. 但是不同类型的对象却重名将会导致后创建的函数失败.如果同类型对象创建重名,后创建函数如果有访问权限,则对调用该函数的进程添加这个内核对象,而不会创建新的.
    11.    打开现有内核对象: Open开头的函数,将Create改为Open.这些函数只有3个参数
    12.    会话,命名空间. 获取会话id ProcessIdToSessionId(processID, &sessionID)
    获取进程id: DWORD processID = GetCurrentProcessId(); 将一个命名对象放入全局命名空间: CreateEvent(NULL, FALSE, FALSE, TEXT("Global\MyName"));.将全局放入当前会话:CreateEvent(NULL, FALSE, FALSE, TEXT("Local\MyName"))
    13.    复制内核对象句柄
    BOOL DuplicateHandle(
    HANDLE hSourceProcessHandle,
    HANDLE hSourceHandle,
    HANDLE hTargetProcessHandle,
    PHANDLE phTargetHandle,
    DWORD dwDesiredAccess,      //访问掩码
    BOOL bInheritHandle,          //继承方式
    DWORD dwOptions);                    //0即可
    可能涉及到3个进程. 调用该函数进程. 第一个参数,第3个参数. 第2个参数时与第一个参数进程相关的对象句柄,且不能与第3个参数进程相关.第4个参数用于接收该对象句柄值的句柄指针,标识了复制后的对象在目标进程的索引
  • 相关阅读:
    【算法】 冒泡排序
    【算法】 插入排序
    【算法】 斐波那契数列
    【C#】 RBAC 权限框架
    【jQuery】 实用 js
    【jQuery】 Ajax
    【jQuery】 常用函数
    【jQuery】 资料
    【jQuery】 效果
    Linaro/Yocto/Openwrt
  • 原文地址:https://www.cnblogs.com/freesec/p/6516863.html
Copyright © 2020-2023  润新知