首页 > 其他 > 详细

内核句柄表

时间:2020-07-26 10:40:07      阅读:70      评论:0      收藏:0      [点我收藏+]

一、句柄表


内核对象保持在  _object_header+0x18 位置

技术分享图片

 

 

句柄索引定位对应句柄的计算公式:handle = index / 4 * 8

技术分享图片
#include "stdafx.h"
#include <windows.h>
int main(int argc, char* argv[])
{
    DWORD PID;
    HANDLE hpro = NULL;
    HWND hwnd = FindWindow(NULL,"计算器");
    GetWindowThreadProcessId(hwnd,&PID);
    for(int i=0;i<20;i++)
    {
        hpro=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, TRUE, PID);
        printf("句柄:%x\n",hpro);

        }
    getchar();
    return 0;
}
View Code

运行结果 

技术分享图片

 

 WinDbg 中跟踪结果

 !process 0 0

技术分享图片

 

 

 dt _PROCESS 81b34b88

 技术分享图片

 

dt _HANDLE_TABLE 0xe1fe6190 

技术分享图片

 

 

 这里看到了  TableCode基地址  根据公式   0xe11d1000+0x38/4*8  得到了句柄表

 

句柄表结构

技术分享图片

 

 

1:共两个字节,低字节保留恒为0,高位字节是给SetHandleInformation这个函数用的,比如写成SethandleInformation(Handle, HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE),那么这个位置将被写入0x02(HANDLE_FLAG_PROTECT_FROM_CLOSE宏的值为0x00000002,取最低字节,最终这块是0x0200

2:这块是访问掩码,是给OpenProess这个函数用的
OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)具体存的就是这个函数第一个参数的值
3&4:共4个字节,其中bit0和bit2存储句柄的属性,默认为0,bit1表示该句柄是否可继承(参考OpenProcess的第二个参数)

 

查看句柄表对应程序 

81a4d8fb   需要清理后三位bit 也就是  81a4d8f9  此时该地址指向 _OBJECT_HEADER ,想查看真正的内核对象结构体还要加上0x18

技术分享图片

 

内核句柄表

原文:https://www.cnblogs.com/Fentiao/p/13378887.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!