您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Windows内核的分析
Gloomy对Windows内核的分析(对象管理器)目录==========InsideWINDOWSNTObjectManager00.对象化的WindowsNT01.WindowsNT对象管理器02.对象类型03.ObjectDirectory与SymbolicLink04.对象的创建与对象的结构05.ObjectType结构体06.Дальнейшаяжизньобъекта-простейшийслучай07.句柄数据库08.对象的安全性09.命名对象0a.对象的消亡0b.其它管理器函数0c.结语附录13.从用户模式下获取对象信息14.某些与对象管理相关的系统服务00.对象化的WindowsNT=========================如果您熟悉WindowsNT体系结构,当然会知道在这个系统中资源都是以对象的形式存在的。这样集中了对资源的管理。实际上,所有的WindowsNT子系统无论如何都要使用资源,也就是说都要经过对象管理器。对象管理器是WindowsNT的子系统,它对对象提供支持。对对象的使用贯穿了整个操作系统,真正的“对象化”的NT对应用程序隐藏了Win32子系统,甚至于部分的隐藏了系统调用接口。通常,当提到NT的体系结构时,都会说到各种管理器(对象管理器、内存管理器等等)。所有这些管理器都是WindowsNT内核(ntoskrnl.exe)的一部分。NT的内核主要使用C语言编写的,每一个管理器本身都是一组函数,这些函数都被封装在相应的模块中。并不是所有的都定义了接口。管理器之间借助于函数调用相互协作(在内核内部)。一部分函数从内核中导出的并公开了使用方法以在内核模式下使用。对象管理器是一组形如ObXXXX的函数。实际上并不是所有的函数都是从内核中导出的。一般说来,对象管理器主要在内核中实现。例如,许多系统调用(NtCreateProcess、NtCreateEvent...)的处理都与这样或是那样的对象相联系。但是服务隐藏了对象管理器,不让我们的程序知道。甚至于驱动程序的设计人员未必需要大量直接的与对象管理器打交道。尽管如此,了解内核是如何实际工作的无疑非常重要,更为重要的是对象管理器还与安全管理器密切相关。理解了对象管理器就揭开了NT中许多起初并不明显,但潜在具有的可能性……01.WindowsNT对象管理器================================对象管理器是NT内核中许多形如ObXXX的函数。某些函数并未导出并只在内核内部由子系统使用。对于在内核之外的使用,主要是通过未公开的函数。ObAssignSecurity,ObCheckCreateObjectAccess,ObCheckObjectAccess,ObCreateObject,ObDereferenceObject,ObFindHandleForObject,ObGetObjectPointerCount,ObGetObjectSecurity,ObInsertObject,ObMakeTemporaryObject,ObOpenObjectByName,ObOpenObjectByPointer,ObQueryNameString,ObQueryObjectAuditingByHandle,ObReferenceObjectByHandle,ObReferenceObjectByName,ObReferenceObjectByPointer,ObReleaseObjectSecurity,ObSetSecurityDescriptorInfo,ObfDereferenceObject,ObfReferenceObject为了描述对象管理器,我们先来看一下什么是对象。02.对象类型================对象管理器本身就工作在某些对象之上。其中之一就是objecttype。objecttype用于描述所有对象的共同属性。objecttype由函数ObCreateObjectType(...)在内核初始化子系统的时候创建(也就是说是在系统初始化的时候)。我们所感兴趣的并不是ObCreateObjectType(...)函数,因为其并未由内核导出。但是,在objecttype中的信息是非常重要的。关于这些我们少后再说。大概的讲,任何对象都可以分为两个部分:一部分包含管理上必需的信息(我们称之为首部),另一部分填充并确定创建该对象的子系统的必需信息(这是对象的body)。对象管理器对首部进行操作,而实际上并不对对象的内容感兴趣,还有一些对象是对象管理器本身使用的。objecttype正如其名字所示的那样,定义了对象的类型。每一个对象都有对其objecttype的引用,对象管理器也会非常频繁的使用对象的body。objecttype结构体的一个域是类型的名字。在NT下有以下各类型:Type,Directory,SymbolicLink,Event,EventPair,Mutant,Semaphore,Windows,Desktop,Timer,File,IoCompletion,Adapter,Controller,Device,Driver,Key,Port,Section,Process,Thread,Token,ProfileType类型的objecttype不足一惧。要知道扼要的讲objecttype是用于管理器的对象,其和所有其它的对象是一样的,也有自己的Type类型(它自己的Type类型对象)。如果好好的想一下的话,这样做似乎也并不奇怪。下面,在Type这个话题下,主要来讲几个与objecttype相关的名词。03.ObjectDirectory与SymbolicLink===================================所有列举出的类型都是由不同的子系统创建的。我们现在讨论Directory和SymbolicLink类型,因为在对象管理器本身的工作中要用到这些类型的对象(这些类型是其在其自己初始化时创建的)。NT的对象可以有名字,还可以组织成树型的结构。Directory对象正是用来组织这种结构的。它的用途非常简单——保存对其它对象的引用,例如,另外一个Directory对象。Directory的body的结构非常简单:typedef_DIR_ITEM{PDIR_ITEMNext;PVOIDObject;}DIR_ITEM,*PDIR_ITEM;typedefstruct_DIRECTORY{PDIR_ITEMHashEntries[37];PDIR_ITEMLastHashAccess;//94hDWORDLastHashResult;//98h}DIRECTORY,*PDIRECTORY;路径用于保存命名对象。路径本身是37个entry的哈希表。表中的元素除保存着指向后面元素的指针之外,还保存着指向属于该路径对象的body的指针。哈希函数形式如下:DWORDHash(constchar*str);{char*ptr=str;intstr_len=strlen(str);charSym;inthash=0;while(str_len--){Sym=*ptr++;ToUpperCase(&Sym);Sym-='';hash=hash*3+(hash1)+Sym;//умножениезнаковое}returnhash%37;}当然,这里的代码只是给出程序的逻辑,并不是真正的实现。这个例子主要是基于对ObpLookupDirectoryEntry(...)函数的分析写出的。最后的两个域反映出对哈希表的最后访问。LastHashAccess是指向最后访问的entry的指针。LastHashResult包含成功查找到的单元。NT想优化对路径的查找,而且如果在查找的结果中找到的entries中的一个entry不在表的开头,则这个表的元素就要被移到表的开头(认为后面对该对象的访问的几率最大)。Directory是对象,和其它的对象一样,它也可以有名字。如果再考虑到对象还有对自己所在目录的引用,则对可以画出树型的层级结构这个问题就能够理解了。在WindowsNT中包含着根目录ObpRootDirectoryObject,WindowsNT的命名对象树就从这里开始。同时,还有ObpTypeDirectoryObject目录,它包含所有的objecttype(使用这个树是为了防止objecttype重名)。内核表ObpObjectTypes中保存着指向objecttype的指针。再有,对于每一个类型的创建,子系统都保存着单独的指针。SymbolicLink这个objecttype用于保存字符串。在树中进行查找时它们被用作引用。例如,对象\??\C:(这表示,在ObpRootDirectoryObject中有对路径“??”的引用,在这个路径下包含着对象“C:”)就是SymbolicLink对象并包含字符串“\Device\Harddisk0\Partition1”。该对象格式如下:typedefstruct_SYMBOLIC_LINK{LARGE_INTEGERCreationTime;//времясозданияот1601годаUNICODE_STRINGLink;}SYMBOLIC_LINK,*PSYMBOLIC_LINK;现在有了对管理器用到的类型和对象的一般概念,我们可以来研究更为具体的信息了。04.对象的创建与对象的结构===============================对象由ObCreateObject函数创建。这个函数由ntoskrnl.exe导出,下面给出其原型:NTSTATUSNTOSKRNLObCreateObject(KPROCESSOR_MODEbMode,//kernel/userPOBJECT_TYPEType,//对象类型POBJECT_ATTRIBUTESAttributes,//属性BOOLEANbObjectMode,//kernel/user对象类型DWORDReserved,//函数未使用DWORDBodySize,//对象body的大小DWORDPagedPoolQuotaOPTIONAL,//如果为0DWORDNonPagedPoolQuotaOPTIONAL,//则回收PVOID*pObjectBody//指向body的指针);参数Reserved可以简单的忽略。bObjectMode定义了是否要从用户模式访问。PagedPollQuota和NonPagedPollQuota是与这些对象相关联的分页池和非分页池的限额。限额记录了进程每一次其打开句柄的情况。进程有一个限额的阈值,其不能超越。POBJECT_ATTRIBUTES结构体是公开的(ntdef.h中有),但我这里还要将其给出,因为后面会经常引用其中的域。typedefstruct_OBJECT_ATTRIBUTES{ULONGLength;HANDLERootDirectory;PUNICODE_STRINGObjectName;ULONGAttributes;PVOIDSecurityDescriptor;PVOIDSecurityQualityOfService;}OBJECT_ATTRIBUTES;typedefOBJECT_ATTRIBUTES*POBJECT_ATTRIBUTES;现在来集中讨论重要的域RootDirectory和ObjectName。RootDirectory是什么,现在我想已经能猜到了——将要包含对象(如果需要)的目录。ObjectName——见名知意。顺便说一下,可以不指明RootDirectory,但在ObjectName中要指定对象的完整路径,这时对象将在起始于ObpRootDirectoryObject的树中创建。关于安全方面的话我们单独讲,所以Security域嘛……暂时留下不提。剩下Attributes域。ntde
本文标题:Windows内核的分析
链接地址:https://www.777doc.com/doc-2856363 .html