Inside WINDOWS NT Object Manager--1--(好文章,如果懂俄文就好了)
目录
==========
Inside WINDOWS NT Object Manager
00."对象化的" Windows NT
01.Windows NT对象管理器
02.对象类型
03.Object Directory 与 SymbolicLink
04.对象的创建与对象的结构
05.Object Type 结构体
06.Дальнейшая жизнь объекта - простейший случай
07.句柄数据库
08.对象的安全性
09.命名对象
0a.对象的消亡
0b.其它管理器函数
0c.结语
附录
13.从用户模式下获取对象信息
14.某些与对象管理相关的系统服务
00."对象化的" Windows NT
=========================
如果您熟悉Windows NT体系结构,当然会知道在这个系统中资源都是以对象的形式存在的。这样集中了对资源的管理。实际上
,所有的Windows NT子系统无论如何都要使用资源,也就是说都要经过对象管理器。对象管理器是Windows NT的子系统,它对
对象提供支持。对对象的使用贯穿了整个操作系统,真正的“对象化”的NT对应用程序隐藏了Win32子系统,甚至于部分的隐藏
了系统调用接口。
通常,当提到NT的体系结构时,都会说到各种管理器(对象管理器、内存管理器等等)。所有这些管理器都是Windows NT内核
(ntoskrnl.exe)的一部分。NT的内核主要使用C语言编写的,每一个管理器本身都是一组函数,这些函数都被封装在相应的模
块中。并不是所有的都定义了接口。管理器之间借助于函数调用相互协作(在内核内部)。一部分函数从内核中导出的并公开
了使用方法以在内核模式下使用。
对象管理器是一组形如ObXXXX的函数。实际上并不是所有的函数都是从内核中导出的。一般说来,对象管理器主要在内核中实
现。例如,许多系统调用(NtCreateProcess、NtCreateEvent...)的处理都与这样或是那样的对象相联系。但是服务隐藏了对
象管理器,不让我们的程序知道。甚至于驱动程序的设计人员未必需要大量直接的与对象管理器打交道。尽管如此,了解内核
是如何实际工作的无疑非常重要,更为重要的是对象管理器还与安全管理器密切相关。理解了对象管理器就揭开了NT中许多起
初并不明显,但潜在具有的可能性……
01.Windows NT对象管理器
================================
对象管理器是NT内核中许多形如ObXXX的函数。某些函数并未导出并只在内核内部由子系统使用。对于在内核之外的使用,主要
是通过未公开的函数。
ObAssignSecurity, ObCheckCreateObjectAccess , ObCheckObjectAccess,
ObCreateObject, ObDereferenceObject, ObFindHandleForObject,
ObGetObjectPointerCount, ObGetObjectSecurity, ObInsertObject,
ObMakeTemporaryObject, ObOpenObjectByName, ObOpenObjectByPointer,
ObQueryNameString, ObQueryObjectAuditingByHandle,
ObReferenceObjectByHandle, ObReferenceObjectByName,
ObReferenceObjectByPointer, ObReleaseObjectSecurity,
ObSetSecurityDescriptorInfo, ObfDereferenceObject, ObfReferenceObject
为了描述对象管理器,我们先来看一下什么是对象。
02.对象类型
================
对象管理器本身就工作在某些对象之上。其中之一就是object type。object type用于描述所有对象的共同属性。object type
由函数ObCreateObjectType(...)在内核初始化子系统的时候创建(也就是说是在系统初始化的时候)。我们所感兴趣的并不是
ObCreateObjectType(...)函数,因为其并未由内核导出。但是,在object type中的信息是非常重要的。关于这些我们少后再
说。
大概的讲,任何对象都可以分为两个部分:一部分包含管理上必需的信息(我们称之为首部),另一部分填充并确定创建该对
象的子系统的必需信息(这是对象的 body)。对象管理器对首部进行操作,而实际上并不对对象的内容感兴趣,还有一些对象
是对象管理器本身使用的。object type正如其名字所示的那样,定义了对象的类型。每一个对象都有对其object type的引用
,对象管理器也会非常频繁的使用对象的body。object type结构体的一个域是类型的名字。在NT下有以下各类型:
Type, Directory, SymbolicLink, Event, EventPair, Mutant, Semaphore,
Windows, Desktop, Timer, File, IoCompletion, Adapter, Controller, Device,
Driver, Key, Port, Section, Process, Thread, Token, Profile
Type类型的object type不足一惧。要知道扼要的讲object type是用于管理器的对象,其和所有其它的对象是一样的,也有自
己的Type类型(它自己的Type类型对象)。如果好好的想一下的话,这样做似乎也并不奇怪。下面,在Type这个话题下,主要
来讲几个与object type相关的名词。
03.Object Directory与SymbolicLink
===================================
所有列举出的类型都是由不同的子系统创建的。我们现在讨论Directory和SymbolicLink类型,因为在对象管理器本身的工作中
要用到这些类型的对象(这些类型是其在其自己初始化时创建的)。
NT的对象可以有名字,还可以组织成树型的结构。Directory对象正是用来组织这种结构的。它的用途非常简单——保存对其它
对象的引用,例如,另外一个Directory对象。Directory的body的结构非常简单:
typedef _DIR_ITEM{
PDIR_ITEM Next;
PVOID Object;
}DIR_ITEM,*PDIR_ITEM;
typedef struct _DIRECTORY{
PDIR_ITEM HashEntries[37];
PDIR_ITEM LastHashAccess; //94h
DWORD LastHashResult; //98h
}DIRECTORY,*PDIRECTORY;
路径用于保存命名对象。路径本身是37个entry的哈希表。表中的元素除保存着指向后面元素的指针之外,还保存着指向属于该
路径对象的body的指针。哈希函数形式如下:
DWORD Hash(const char* str);
{
char *ptr=str;
int str_len=strlen(str);
char Sym;
int hash=0;
while(str_len--)
{
Sym=*ptr++;
ToUpperCase(&Sym);
Sym-=' ';
hash=hash*3+(hash>>1)+Sym;// умножение знаковое
}
return hash%37;
}
当然,这里的代码只是给出程序的逻辑,并不是真正的实现。这个例子主要是基于对ObpLookupDirectoryEntry(...)函数的分
析写出的。最后的两个域反映出对哈希表的最后访问。LastHashAccess是指向最后访问的entry的指针。LastHashResult包含成
功查找到的单元。NT想优化对路径的查找,而且如果在查找的结果中找到的entries中的一个entry不在表的开头,则这个表的
元素就要被移到表的开头(认为后面对该对象的访问的几率最大)。
Directory是对象,和其它的对象一样,它也可以有名字。如果再考虑到对象还有对自己所在目录的引用,则对可以画出树型的
层级结构这个问题就能够理解了。
在Windows NT中包含着根目录ObpRootDirectoryObject,Windows NT的命名对象树就从这里开始。同时,还有
ObpTypeDirectoryObject目录,它包含所有的object type(使用这个树是为了防止object type重名)。内核表
ObpObjectTypes中保存着指向object type的指针。再有,对于每一个类型的创建,子系统都保存着单独的指针。
SymbolicLink这个object type用于保存字符串。在树中进行查找时它们被用作引用。例如,对象\??\C:(这表示,在
ObpRootDirectoryObject中有对路径 “??”的引用,在这个路径下包含着对象“C:”)就是SymbolicLink对象并包含字符串“
\Device\Harddisk0\ Partition1”。该对象格式如下:
typedef struct _SYMBOLIC_LINK{
LARGE_INTEGER CreationTime; // время создания от 1601 года
UNICODE_STRING Link;
}SYMBOLIC_LINK,*PSYMBOLIC_LINK;
现在有了对管理器用到的类型和对象的一般概念,我们可以来研究更为具体的信息了。