Windows内核对象头部结构

本文探讨了Windows内核对象的组成,特别是OBJECT_HEADER结构及其后续48字节的对象体。通过逆向分析ObCreateObject函数,揭示了OBJECT_HEADER中的OBJECT_HEADER_QUOTA_INFO、OBJECT_HEADER_HANDLE_INFO、OBJECT_HEADER_NAME_INFO和OBJECT_HEADER_CREATOR_INFO结构如何根据特定条件被创建。分析了这些结构对Init和Idle进程、句柄信息、名字记录以及类型信息的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Windows中,内核对象由三部分组成,其中第一部分是由数个不确定的结构组成,第二部分就是结构头OBJECT_HEADER,第三部分则是对象体。后两部分容易确定,OBJECT_HEADER后48个字节就是对象体。第一部分则是完全隐藏起来的机制,而且Win7系统中OBJECT_HEADER里也没有了前面几个结构的偏移信息,所以需要具体研究一下这个字段的生成机制。
这个结构肯定是在ObCreateObject中创建的,其中的ObpAllocateObject完成了对象的内存分配和初始化,就从这个函数着手进行分析。
下面是对ObpAllocateObject的逆向,可能有些地方和源程序流程不一样,中间许多流程进行了优化,只能尽量去还原成正确的C代码。


NTSTATUS ObpAllocateObject(POBJECT_CREATE_INFO CreateInfo,
    KPROCESSOR_ACCESS OwnerMode,
    POBJECT_TYPE ObjectType,
    PUNICODE_STRING CapturedName,
    DWORD ObjectBodySize,
    POBJECT_HEADER* ObjectHeader) {

    DWORD InfoMask = 0;
    DWORD ObjectTotalSize = 0;
    NTSTATUS Status;
    PBYTE Object;
    PBYTE ObjectFields;
    POBJECT_HEADER_CREATOR_INFO CreatorInfo;
    POBJECT_HEADER_HANDLE_INFO HandleInfo;
    POBJECT_HEADER_QUOTA_INFO QuotaInfo;
    POBJECT_HEADER_NAME_INFO NameInfo;
    PEPROCESS CurrentProcess = PsGetCurrentProcess();

    //前面不知道是干嘛的
    if (CreateInfo->Attributes & 0x20) {
        ObjectTotalSize += 0x10;
        InfoMask |= 0x10;
    }

    //需要性能技术
    if (CurrentProcess != PsInitialSystemProcess) {
        if (CurrentProcess != PsIdleProcess)
            if (PsInitialSystemProcess != NULL) {
                InfoMask |= 8;
                ObjectTotalSize += sizeof(OBJECT_HEADER_QUOTA_INFO);
            }
    }

    //需要记录句柄计数信息
    if (ObjectType-></
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值