内核句柄表

一、句柄表


内核对象保持在  _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

猜你喜欢

转载自www.cnblogs.com/Fentiao/p/13378887.html