Windows对象 (Object) 结构

Windows内核对象头部结构 在Windows中,内核对象由三部分组成,其中第一部分是由数个不确定的结构组成,第二部分就是结构头OBJECT_HEADER,第三部分则是对象体。后两部分容易确定,OBJECT_HEADER后48个字节就是对象体。第一部分则是完全隐藏起来的机制,而且Win7系统中OBJECT_HEADER里也没有了前面几个结构的偏移信息,所以需要具体研究一下这个字段的生成机制。 这个结构肯定是在ObCreateO 阅读详情

Windows系统的各种资源以对象(Object)的形式来组织,例如 File Object, Driver Object, Device Object等等,但实际上这些所谓的“对象”在系统的对象管理器(Object Manager)看来只是完整对象的一个部分——对象实体(Object Body)。Windows XP中有31种不同类型的对象,Object Body反映了某一类型对象的特征信息,例如,文件对象使用FILE_OBJECT结构描述、驱动对象使用DRIVER_OBJECT结构描述、 DEVICE_OBJECT用于描述设备对象等等。而各种Object的共有的信息(例如,对象类型、对象的引用计数、句柄数等信息)保存在 OBJECT_HEADER与其他的几个结构中。换而言之,在对象管理器内部,不同类型的对象具有相同的Object Header,但Object Body部分却是不同的。
先放上一张Windows Object完整的结构图,其中OBJECT_HEADER取自Windows XP SP2 英文版。


         +----------------------------------------------------------------+
+------->| ( OBJECT_HEADER_QUOTA_INFO )                                   |
|  +---->| ( OBJECT_HEADER_HANDLE_INFO )                                  |
|  |  +->| ( OBJECT_HEADER_NAME_INFO )                                    |
|  |  |  | ( OBJECT_HEADER_CREATOR_INFO )                                 |
|  |  |  +------------------------[ Object Header ]-----------------------+
|  |  |  | nt!_OBJECT_HEADER                                              |
|  |  |  |   +0x000 PointerCount     : Int4B                              |
|  |  |  |   +0x004 HandleCount      : Int4B                              |
|  |  |  |   +0x004 NextToFree       : Ptr32 Void                         |
|  |  |  |   +0x008 Type             : Ptr32 _OBJECT_TYPE                 |
|  |  +--|   +0x00c NameInfoOffset   : UChar                              |
|  +-----|   +0x00d HandleInfoOffset : UChar                              |
+--------|   +0x00e QuotaInfoOffset  : UChar                              |
         |   +0x00f Flags            : UChar                              |
         |   +0x010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION   |
         |   +0x010 QuotaBlockCharged : Ptr32 Void                        |
         |   +0x014 SecurityDescriptor : Ptr32 Void                       |
         |   +0x018 Body             : _QUAD                              |
         +-------------------------[ Object Body ]------------------------+
         | OBJECT_DIRECTORY, DRIVER_OBJECT, DEVICE_OBJECT, FILE_OBJECT... |
         +----------------------------------------------------------------+

一个对象由三部分组成,在Object Header之前是一段变长的区域,由四个独立的结构体组成:

typedef struct _OBJECT_HEADER_QUOTA_INFO {
    ULONG PagedPoolCharge;
    ULONG NonPagedPoolCharge;
    ULONG SecurityDescriptorCharge;
    PEPROCESS ExclusiveProcess;
#ifdef _WIN64
    ULONG64  Reserved;   // Win64 requires these structures to be 16 byte aligned.
#endif
} OBJECT_HEADER_QUOTA_INFO, *POBJECT_HEADER_QUOTA_INFO;

typedef struct _OBJECT_HEADER_HANDLE_INFO {
    union {
        POBJECT_HANDLE_COUNT_DATABASE HandleCountDataBase;
        OBJECT_HANDLE_COUNT_ENTRY SingleEntry;
    };
} OBJECT_HEADER_HANDLE_INFO, *POBJECT_HEADER_HANDLE_INFO;

// begin_ntosp
typedef struct _OBJECT_HEADER_NAME_INFO {
    POBJECT_DIRECTORY Directory;
    UNICODE_STRING Name;
    ULONG QueryReferences;
#if DBG
    ULONG Reserved2;
    LONG DbgDereferenceCount;
#ifdef _WIN64
    ULONG64  Reserved3;   // Win64 requires these structures to be 16 byte aligned.
#endif
#endif
} OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;
// end_ntosp

typedef struct _OBJECT_HEADER_CREATOR_INFO {
    LIST_ENTRY TypeList;
    HANDLE CreatorUniqueProcess;
    USHORT CreatorBackTraceIndex;
    USHORT Reserved;
} OBJECT_HEADER_CREATOR_INFO, *POBJECT_HEADER_CREATOR_INFO;

一个对象可以包含全部四个结构,也可能只包含其中的某个,因此这段区域是变长的。
之后是OBJECT_HEADER结构,NameInfoOffset、HandleInfoOffset、QuotaInfoOffset分别为 OBJECT_HEADER到OBJECT_HEADER_NAME_INFO、OBJECT_HEADER_HANDLE_INFO、 OBJECT_HEADER_QUOTA_INFO这三个结构的偏移。

WinDBG的“!object”命令可以显示对象的信息:

kd> !object /Driver/Disk
Object: 8985da08  Type: (898df3b0) Driver
    ObjectHeader: 8985d9f0
    HandleCount: 0  PointerCount: 6
    Directory Object: e1005160  Name: Disk

继续看一下OBJECT_HEADER结构的信息:

kd> dt nt!_object_header 8985d9f0
nt!_OBJECT_HEADER
   +0x000 PointerCount     : 6
   +0x004 HandleCount      : 0
   +0x004 NextToFree       : (null)
   +0x008 Type             : 0x898df3b0 _OBJECT_TYPE
   +0x00c NameInfoOffset   : 0x10 ''
   +0x00d HandleInfoOffset : 0 ''
   +0x00e QuotaInfoOffset  : 0 ''
   +0x00f Flags            : 0x32 '2'
   +0x010 ObjectCreateInfo : 0x00000001 _OBJECT_CREATE_INFORMATION
   +0x010 QuotaBlockCharged : 0x00000001
   +0x014 SecurityDescriptor : 0xe100c843
   +0x018 Body             : _QUAD

在NameInfoOffset中指出OBJECT_HEADER_NAME_INFO的便宜量为0×10,它的地址为OBJECT_HEADER - OBJECT_HEADER.NameInfoOffset,即0×8985d9f0-0×10,继续来看:

kd> dt nt!_object_header_name_info 8985d9f0-0x10
nt!_OBJECT_HEADER_NAME_INFO
   +0x000 Directory        : 0xe1005160 _OBJECT_DIRECTORY
   +0x004 Name             : _UNICODE_STRING "Disk"
   +0x00c QueryReferences  : 1

第三部分就是对象的实体部分(Object Body),根据对象类型的不同,这部分的结构也不相同。日常使用的DRIVER_OBJECT、DEVICE_OBJECT、FILE_OBJECT等等都是Object Body结构,继续回头看一下!object /Driver/Disk的输出,Object: 8985da08是Object Body部分——DRIVER_OBJECT结构。

kd> dt nt!_driver_object 8985da08
nt!_DRIVER_OBJECT
   +0x000 Type             : 4
   +0x002 Size             : 168
   +0x004 DeviceObject     : 0x89900c68 _DEVICE_OBJECT
   +0x008 Flags            : 0x12
   +0x00c DriverStart      : 0xf7627000
   +0x010 DriverSize       : 0x8e00
   +0x014 DriverSection    : 0x89927a70
   +0x018 DriverExtension  : 0x8985dab0 _DRIVER_EXTENSION
   +0x01c DriverName       : _UNICODE_STRING "/Driver/Disk"
   +0x024 HardwareDatabase : 0x8068db10 _UNICODE_STRING "/REGISTRY/MACHINE/HARDWARE/DESCRIPTION/SYSTEM"
   +0x028 FastIoDispatch   : (null)
   +0x02c DriverInit       : 0xf762e8ab     disk!GsDriverEntry+0
   +0x030 DriverStartIo    : (null)
   +0x034 DriverUnload     : 0xf763e53a     CLASSPNP!ClassUnload+0
   +0x038 MajorFunction    : [28] 0xf763dc30     CLASSPNP!ClassCreateClose+0

kd> !drvobj 8985da08
Driver object (8985da08) is for:
/Driver/Disk
Driver Extension List: (id , addr)
(f763e3be 8985d8f0)
Device Object list:
89900c68  89896c68  8985ec68  8985cab8

现在有这样一个问题,我们经常使用Object Body的结构,但是要访问OBJECT_HEADER该如何做呢?
OBJECT_HEADER的大小为0×18字节,因此Object Body = OBJECT_HEADER + 0×18,但是0×18是个硬编码值,如果OBJECT_HEADER在以后的系统中发生了变化,显然用这个0×18是不可靠的。
OBJECT_HEADER结构中有一个Body成员,如果执行“dt nt!_OBJECT_HEADER -b”会有以下的输出:

kd> dt nt!_OBJECT_HEADER -b
   +0x000 PointerCount     : Int4B
   +0x004 HandleCount      : Int4B
   +0x004 NextToFree       : Ptr32
   +0x008 Type             : Ptr32
   +0x00c NameInfoOffset   : UChar
   +0x00d HandleInfoOffset : UChar
   +0x00e QuotaInfoOffset  : UChar
   +0x00f Flags            : UChar
   +0x010 ObjectCreateInfo : Ptr32
   +0x010 QuotaBlockCharged : Ptr32
   +0x014 SecurityDescriptor : Ptr32
   +0x018 Body             : _QUAD
      +0×000 DoNotUseThisField : Float

注意斜体字部分。Body成员在OBJECT_HEADER结构中的偏移量实际上就是Object Body到OBJECT_HEADER的偏移量(0×18),它只是作为定位偏移量来使用,因此会有“Do Not Use This Field”的提示。
在WRK的代码中定义了一个宏函数(见 %wrk%/base/ntos/inc/ob.h),用于从Object Body访问OBJECT_HEADER结构。

#define OBJECT_TO_OBJECT_HEADER( o ) /
    CONTAINING_RECORD( (o), OBJECT_HEADER, Body )

//
// Calculate the address of the base of the structure given its type, and an
// address of a field within the structure.
//
#ifndef CONTAINING_RECORD
#define CONTAINING_RECORD(address, type, field) /
    ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
#endif

利用OBJECT_TO_OBJECT_HEADER()传递一个Object Body的地址给它(例如,Disk.sys的DriverObject),就可以轻松的得到这个对象的OBJECT_HEADER结构。

—
by CDrea
2007-07-04
CDrea_at_safechina[dot]org
http://www.safechina.org
http://www.phpfav.com

 
Windows内核编程基础篇之常见内核数据结构 1,驱动框架常见数据结构有 驱动对象结构,  设备对象结构等。         A)驱动对象结构  (DRIVER_OBJECT)             每个驱动对象代表一个已加载的内核驱动程序,指向驱动对象结构的指针常常作为DriverEntry,AddDevice, Unload等函数的参数。驱动对象结构式半透明的。其中公开的域包括DeviceObject,DriverExtensio 阅读详情

相关推荐

OpenHarmony系统参数权限配置避坑指南:从param get/set失败到SELinux标签实战

本文深入解析OpenHarmony系统参数权限配置的常见问题与解决方案,涵盖DAC和SELinux双重权限控制机制。通过实战案例演示如何配置`param get/set`权限,解决'Permission denied'错误,并提供三方应用访问参数的安全方案,帮助开发者高效完成系统调试与优化。

weixin_27013291的博客 450

ObjectHeader、ObjectType和ObjectHook的学习

  0x01 前言   之前研究RootKit技术,发现了对象钩子这个概念,一直不知道是什么,然后在网上搜,最先找到的是sudami的一篇文章,于是跟着大牛的脚步研究,其中也参考<内核情景分析>,这本书真是每次看每次有收获。下面记录一下学习过程。   0x02 OBJECT_HEADER结构   这是对象的数据结构的形态,其中OBJECT_HEADER...

weixin_30887919的博客 748

告别卡顿!在RK3588上优化Gstreamer推拉流与RKNN推理的完整Pipeline实战

本文详细介绍了在RK3588平台上优化Gstreamer推拉流与RKNN推理的全链路Pipeline实战。通过解码环节参数调优、RKNN线程管理、内存预分配策略以及编码输出优化,实现60FPS流畅处理与亚秒级延迟。特别针对实时视频分析场景,提供了从rtspsrc到appsink的毫秒级优化方案,助力开发者构建零卡顿的智能视觉系统。

weixin_30698527的博客 485

对象头(Object Header)

后四个字节Klass Word表示这个对象属于哪个类(比如Student类,或者Person类)如果是数组对象,则对象头有96位,还有32位用来表示数组长度。总共八个字节,64位。

weixin_47414034的博客 538

【图像去噪】论文精读:FM2S: Self-Supervised Fluorescence Microscopy Denoising With Single Noisy Image

论文题目:FM2S: Self-Supervised Fluorescence Microscopy Denoising With Single Noisy Image —— FM2S:单噪声图像自监督荧光显微镜去噪arXiv 2024!显微图像去噪!通过可视化详细的细胞结构和生物过程,荧光显微镜具有显着先进的生物学研究。然而,由于难以精确建模固有噪声和获取干净图像进行训练,这种图像去噪任务往往面临挑战,这限制了大多数现有方法。在本文中,我们提出了一种有效的。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 411

计算机视觉(角点检测)- 1 - Harris角点检测

计算机视觉(角点检测)-1.1 Harris角点检测学习前言 学习前言   今天更新一下计算机视觉的东西吧,哈哈哈o( ̄︶ ̄)o   关于角点检测呢,就是检测图像中角点的算法,常见的有四种常见的算法:Moravec角点检测算法、 Harris角点检测算法、Shi-Tomasi 算法、FAST角点检测算法,不过常用的就两种吧——Harris角点检测算法、Shi-Tomasi 算法(反正我基本上就只用到这两种,先着重介绍前面两种,后面再花世界介绍吧)(~ ̄▽ ̄)~ ...

qq_40374812的博客 1万+

探索Windows内核系列——Object的结构

探索Windows内核系列——Object的结构

sunjiaoya的博客 1487

数字电视中的 Closed Caption (CC) 字幕标准协议

本文将详细介绍 DVB中的 CC 字幕标准协议,包括数据结构格式、字段定义、字段占用比特数以及字段用途。此外,本文还将举例说明如何从 TS 传输流中解析 CC 字幕信息,并组织打包到电视节目中进行显示。

以实战经验介绍行业知识 670

Windowsx64内核对象管理分析

x64windows内核分析 内核对象管理

u013677637的博客 877

【考试大纲】中级多媒体应用设计师考试大纲

中级多媒体应用设计师考试大纲

邓邓子的博客 382

SpringBoot实战教程-springboot概论

Spring Boot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,以及自动配置。内置web容器,帮助开发者能够实现快速开发,简化了应用系统的初始搭建以及开发过程。

鸟哥哥的专栏 4155

对象头信息Object Header

备注:配合java中的锁,以及jvm创建对象的具体过程,tlab等知识联系观看 tlab:https://blog.youkuaiyun.com/xiaomingdetianxia/article/details/77688945 锁:https://blog.youkuaiyun.com/zqz_zqz/article/details/70233767 HotSpot 虚拟机的对象头包括两部分信息:Mark Wo...

whathellll的博客 4175

【安全设备篇】HVV面试专题

还有就是这个可能是被访问的这个内网系统,本身业务系统存在业务逻辑问题,因为内网所布置的很多业务系统往往不会考虑一些安全性问题,比如在正常的业务逻辑请求中直接带了sql语句,就会触发设备规则产生告警,这一类是属于误报,然后会将此告警上报给研判人员,需要研判组专家和甲方客户确认下是否是该系统存在此业务逻辑问题,并且需要确认告警的源ip在此告警的时间段附近有没有进行操作过。天眼日志分析主要基于系统和应用程序的日志数据来识别安全威胁,而威胁感知则通过收集和分析多种来源的情报信息。理解威胁的性质和威胁背后的原理。

大河之犬的博客 7925

Windows对象(Object)结构

from 5eCur!ty LabsWindows系统的各种资源以对象(Object)的形式来组织,例如File Object, Driver Object, Device Object等等,但实际上这些所谓的"对象"在系统的对象管理器(Object Manager)看来只是完整对象的一个部分----对象实体(Object Body)。Windows XP中有31种不同类型的对象,Object B

1334

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[转]Windows对象(Object)结构

Windows对象(Object)结构 CDrea 来源:WSS Windows系统的各种资源以对象(Object)的形式来组织,例如File Object, Driver Object, Device Object等等,但实际上这些所谓的“对象”在系统的对象管理器(Object Manager)看来只是完整对象的一个部分——对象实体(Object Body)。W

0xC0000005 894

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

《Windows NT FileSystem Internals》学习笔记之DRIVER_OBJECT对象结构

驱动编程这么长时间了,还没有 彻底理解这个玩意,呵呵惭愧。看了《Windows NT FileSystem Internals》把每一个细节搞清楚了,这里记下来,防止以后忘掉(以后还不知道能不能开发驱动呢)typedef struct _DRIVER_OBJECT{        CSHORT      Type;        CSHORT      Size;     

不论你在什么时候开始,重要的是开始之后就不要停止。 1292

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Windows对象(Object)结构--关于Win7的补充

Windows对象(Object)结构--关于Win7的补充续 《Windows对象(Object)结构》自Window 7开始,_OBJECT_HEADER及其之前的一些结构发生了变化。首先来对比下Win7与XP的_OBJECT_HEADER:[Windows 7]0: kd> dt _object_headernt!_OBJECT_HEADER   +0x0

0xC0000005 2246

2.5 Windows驱动开发:DRIVER_OBJECT对象结构

在Windows内核中,每个设备驱动程序都需要一个`DRIVER_OBJECT`对象,该对象由系统创建并传递给驱动程序的`DriverEntry`函数。驱动程序使用此对象来注册与设备对象和其他系统对象的交互,并在操作系统需要与驱动程序进行交互时使用此对象。`DRIVER_OBJECT`对象还包含了与驱动程序所管理的设备对象相关联的设备扩展结构,以及用于处理`I/O`请求的函数指针等信息。它是驱动程序与操作系统内核之间的桥梁,用于协调设备的操作和管理。本章将探索驱动程序开发的基础部分,了解驱动对象`DRIVE

微软技术分享 1万+

设备对象(DEVICE_OBJECT)

设备对象(DEVICE_OBJECT)

wendyWJGU的博客 1601

Windows对象 (Object) 的组织

在《Windows对象(Object)结构》一文中简单的描述了Object的结构,其中一些结构的细节地方尚未提及。这篇文章中,主要讨论对象管理器(Object Manager)如何组织系统中的各种对象。与文件系统管理文件的方法类似,Windows对象管理器将系统中的对象按照树状结构进行存储。可以使用www.sysinternals.com的winobj来观察系统中的对象。既然系统以树状结构

1505

windows对象管理入门理解

先来一张图。下面文字参考《 Undocumented Windows 2000 Secrets》  四1. Dispatcher对象 此类对象位于系统的最底层,在它们的对象体的开始处都有一个共享 的公共数据结构----DISPATCHER_HEADER(参见列表7-1)。在它们的对象头中包含一个对象类型ID和对

vincent_1011的专栏 3172
上一篇: VISTA SSDT dump
下一篇: 有关__int64类型的打印问题
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值