windows中的对象和高级编程语言中所说的对象还欧区别,准确来讲,windows中的对象其实指的是一种数据结构并且是一种带着“对象头(object head)” 的数据结构!
所以windows中的对象可以基本分为三个部分:对象头、基本对象结构、可选部分!
对象数据结构 可以如图所示
objectheader结构定义
1 lkd> dt _object_header 2 nt!_OBJECT_HEADER 3 +0x000 PointerCount : Int4B 4 +0x004 HandleCount : Int4B 5 +0x004 NextToFree : Ptr32 Void 6 +0x008 Lock : _EX_PUSH_LOCK 7 +0x00c TypeIndex : UChar 8 +0x00d TraceFlags : UChar 9 +0x00e InfoMask : UChar 10 +0x00f Flags : UChar 11 +0x010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION 12 +0x010 QuotaBlockCharged : Ptr32 Void 13 +0x014 SecurityDescriptor : Ptr32 Void 14 +0x018 Body : _QUAD
而创建对象后就会返回句柄,相关进程可以通过句柄来使用此对象,所以对象可以有名和可以无名。
但是大部分情况,对象还是需要名字的,有名对象的组织就成了一个问题!
在windows中通过OBJECT_DIRECTORY目录对项来管理!
我们看下OBJECT_DIRECTORY结构:
1 lkd> dt _object_directory 2 nt!_OBJECT_DIRECTORY 3 +0x000 HashBuckets : [37] Ptr32 _OBJECT_DIRECTORY_ENTRY 4 +0x094 Lock : _EX_PUSH_LOCK 5 +0x098 DeviceMap : Ptr32 _DEVICE_MAP 6 +0x09c SessionId : Uint4B 7 +0x0a0 NamespaceEntry : Ptr32 Void 8 +0x0a4 Flags : Uint4B
对象目录是由多个节点连接而成的树状结构(不考虑符号连接),树的根是一个目录对象,且树中的每个节点都是对象。除根节点之外,所有的中间节点都必须是目录对象或者符号链接对象(OBJECT_SYMBOLIC_LINK对象),普通的对象只能成为叶节点
看OBJECT_DIRECTORY结构中的第一个元素,是一个OBJECT_DIRECTORY_ENTRY结构指针数组,灭个指针用来维系一个目录项结构的队列,注意,除根节点外,每一个对象都需要借助于目录项结构才能插入目录!
1 lkd> dt nt!_object_directory_entry 2 +0x000 ChainLink : Ptr32 _OBJECT_DIRECTORY_ENTRY 3 +0x004 Object : Ptr32 Void 4 +0x008 HashValue : Uint4B
第一个元素仍然指向一个object_directory_entry结构,Object是其连接的对象。
由上图可以看到目录项可以和具体的普通对象结合插入对象目录,也可以和目录节点对象结合又形成一个目录。
分析下上面的图:
根节点是一个目录对象,主体是一个HASH表,这里只表现了其中的两个队列,每一个队列上的目录项(对象)具有相同的HASH值,结合具体的文件便可以轻松理解!
时间: 2024-10-14 16:23:46