一、句柄表
内核对象保持在 _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; }
运行结果
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