標籤:des c style code a ext
目前正在閱讀毛老師的《windows核心情景分析》一書對象管理章節,作此筆記。
Win核心中是使用對象概念來描述管理核心中使用到的資料結構。此對象(Object)均是由對象頭(Object Header)組成,實際上由於對象頭概念的特殊結構,還有些可選成分。於是一個對象實際上是分為三部分。
OBJECT_HEADER對象頭.
資料本體(比如檔案對象File Object、Event等)
附加資訊(比如Object Header Name Info等)
結構如下:
//摘錄自 Reactos代碼
// Object Header
//
typedef struct _OBJECT_HEADER
{
LONG PointerCount;
union
{
LONG HandleCount;
volatile PVOID NextToFree;
};
POBJECT_TYPE Type;
UCHAR NameInfoOffset;
UCHAR HandleInfoOffset;
UCHAR QuotaInfoOffset;
UCHAR Flags;
union
{
POBJECT_CREATE_INFORMATION ObjectCreateInfo;
PVOID QuotaBlockCharged;
};
PSECURITY_DESCRIPTOR SecurityDescriptor;
QUAD Body;
} OBJECT_HEADER, *POBJECT_HEADER;
使用windbg調試windows XP時候 得到結構如下。
lkd> dt _OBJECT_HEADER
nt!_OBJECT_HEADER
+0×000 PointerCount : Int4B
+0×004 HandleCount : Int4B
+0×004 NextToFree : Ptr32 Void
+0×008 Type : Ptr32 _OBJECT_TYPE
+0x00c NameInfoOffset : UChar
+0x00d HandleInfoOffset : UChar
+0x00e QuotaInfoOffset : UChar
+0x00f Flags : UChar
+0×010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
+0×010 QuotaBlockCharged : Ptr32 Void
+0×014 SecurityDescriptor : Ptr32 Void
+0×018 Body : _QUAD
看上去應該差不多,REACTOS對於對象頭的描述基本與windows一致.其中Body便是對象本體,由於本體結構的多樣性,長度是未確定的。所以《windows核心情景分析》中提到,”OBJECT_HEADER_NAME_INFO等放在OBJECT_HEADER下面,用8位位元組表示位移量。” 結構:
在XP系統下使用WINDBG調實驗證時候,略有一些不同的小發現. XP系統中開啟windbg。開啟菜單File->Kernel Dbug.選擇Local本地調試。 使用!handle 可出windbg可擷取的控制代碼列表,我們從控制代碼轉移到對象頭結構分析。
控制代碼很多,我們選擇一個TYPE為FILE的控制代碼,方便下文分析。
000c: Object: 81c53b70 GrantedAccess: 00100020 (Inherit) Entry: e10d7018
Object: 81c53b70 Type: (81feb040) File
ObjectHeader: 81c53b58 (old version)
HandleCount: 1 PointerCount: 1
Directory Object: 00000000 Name: \Program Files\Debugging Tools for Windows (x86) {HarddiskVolume1}
ld> dt _OBJECT_HEADER 81c53b58
nt!_OBJECT_HEADER
+0×000 PointerCount : 1
+0×004 HandleCount : 1
+0×004 NextToFree : 0×00000001
+0×008 Type : 0x81feb040 _OBJECT_TYPE
+0x00c NameInfoOffset : 0 ”
+0x00d HandleInfoOffset : 0×8 ”
+0x00e QuotaInfoOffset : 0 ”
+0x00f Flags : 0×40 ‘@’
+0×010 ObjectCreateInfo : 0x81e900e8 _OBJECT_CREATE_INFORMATION
+0×010 QuotaBlockCharged : 0x81e900e8
+0×014 SecurityDescriptor : (null)
+0×018 Body : _QUAD
結構中得+0×018 Body : _QUAD就是對象主體,我們已知該對象時檔案對象,於是在windbg中以檔案對象FileObject解析該地址
lkd> dt _FILE_OBJECT 81c53b58+0×18
ntdll!_FILE_OBJECT
+0×000 Type : 5
+0×002 Size : 112
+0×004 DeviceObject : 0x81b2c900 _DEVICE_OBJECT
+0×008 Vpb : 0x81fe67c8 _VPB
+0x00c FsContext : 0xe1201510
+0×010 FsContext2 : 0xe12016a8
+0×014 SectionObjectPointer : (null)
+0×018 PrivateCacheMap : (null)
+0x01c FinalStatus : 0
+0×020 RelatedFileObject : (null)
+0×024 LockOperation : 0 ”
+0×025 DeletePending : 0 ”
+0×026 ReadAccess : 0×1 ”
+0×027 WriteAccess : 0 ”
+0×028 DeleteAccess : 0 ”
+0×029 SharedRead : 0×1 ”
+0x02a SharedWrite : 0×1 ”
+0x02b SharedDelete : 0 ”
+0x02c Flags : 0×40002
+0×030 FileName : _UNICODE_STRING “\Program Files\Debugging Tools for Windows (x86)”
+0×038 CurrentByteOffset : _LARGE_INTEGER 0×0
+0×040 Waiters : 0
+0×044 Busy : 0
+0×048 LastLock : (null)
+0x04c Lock : _KEVENT
+0x05c Event : _KEVENT
+0x06c CompletionContext : (null)
那麼我們尋找下那些附加資訊。在對象頭結構中我們可以看到
+0x00d HandleInfoOffset : 0×8 ”
說明_object_handle_information這個結構是存在的,且相對對象頭的位移是0×8。那麼這個結構是在對象頭之前還是對象頭之後呢? 我們來嘗試下。
lkd> dt _object_handle_information 81c53b58-0×8 ntdll!_OBJECT_HANDLE_INFORMATION +0×000 HandleAttributes : 0x81f33908 +0×004 GrantedAccess : 1
lkd> dt _object_handle_information 81c53b58+0×8+0×18 錯誤 ntdll!_OBJECT_HANDLE_INFORMATION +0×000 HandleAttributes : 0x81fe67c8 +0×004 GrantedAccess : 0xe1201510
lkd> dt _object_handle_information 81c53b58+0×8 錯誤 ntdll!_OBJECT_HANDLE_INFORMATION +0×000 HandleAttributes : 0x81feb040 +0×004 GrantedAccess : 0×40000800
很明顯,附加資訊是在對象頭之前,在XP系統中實際調試與毛老師對REACTOS的分析略有不同,應該兩個系統的實現還是存在些許差別。
本文總結了對象頭,對象本體,附加資訊的實際分布,並且從控制代碼擷取控制代碼對應的對象的各種資訊的調試方法。