PoEdu培训 Windows班 第三十四课 Windows 内核对象
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第三十四课 Windows 内核对象

文章类别: 培训笔记 0 评论

Windows 内核对象

内核对象概述

可以通过WinObj进行观察

使用计数

安全性设置

句柄表以及句柄的本质

我们就用文件设备的内核句柄来看

#include <Windows.h>

int main()
{
    HANDLE hFileOne = CreateFile(TEXT("one.txt),
        GENERIC_READ,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    HANDLE hFileTwo = CreateFile(TEXT("two.txt),
        GENERIC_READ,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    CloseHandle(hFileOne);
    CloseHandle(hFileTwo);
    return 0;
}

通过调试我们发现, hFileOne == 0xBC, hFileTwo == 0xC0
注: 每次观察都会不一样, 请自主实际操作
我们突然发现, 这两个句柄的值是连续的, hFileOne + 0x4 == hFileTwo
句柄就是一个数值, 它是如何代表内核对象的?

深入理解句柄表和索引

我们在来看进程启动的过程

我们将上边的例子在拿过来:

#include <Windows.h>

int main()
{
    HANDLE hFileOne = CreateFile(TEXT("one.txt),
        GENERIC_READ,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    CloseHandle(hFileOne);
    HANDLE hFileTwo = CreateFile(TEXT("two.txt),
        GENERIC_READ,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    CloseHandle(hFileTwo);
    return 0;
}

注意, 现在是 将hFileOne关闭后, 在创建hFileTwo
那么, 我们可以看到, hFileOne == 0xB4, hFileTwo == 0xB4

句柄表的使用, 就是去找空白索引, 然后进行填充值
我们在Ring3层拿到的句柄, 其实是没有什么意义的一个索引

句柄表存在的意义

在CloseHandle的时候

当我们Create了内核对象后, 忘记了使用CloseHandle
就会造成内核对象的泄露
当有了句柄表之后, 我的进程内核对象就会知道我当前使用了哪些内核对象
在进程死亡的时候, 就会通过句柄表对使用到的内核对象进行一一的关闭
这样就避免了内核对象的泄露

句柄表可以正确的处理使用过的内核对象从而避免泄露
这就是句柄表存在的意义

可通过ProcessExplorer进行观察进程拥有的句柄数

所用工具下载

  1. WinObj

    • 查看系统中的内核对象
    • 下载地址
    • 本工具需要以管理员权限运行
    • 我们将查看其中的ObjectTypes
    • Alt ObjectTypes
  2. Process Explorer

    • 可以查看进程拥有的句柄数
    • 下载地址
    • 本工具需要以管理员权限运行
    • Alt handles

未完待续...

如有错误,请提出指正!谢谢.

回复