創建系統調用的過程:
1.通過ObCreateObject()創建目標對象
2.目標對象本身的初始化
3.通過ObInsertObject()將目標對象插入對象目錄和句柄表,並返回句柄。
凡是創建對象的系統調用,都要提供至少兩個輸入參數,其一是DesiredAccess,說明所創建對象的訪問模式;另外一個是ObjectAttributes,這是一個OBJECT_ATTRIBUTES結構指針。
ntdll!_OBJECT_ATTRIBUTES +0x000 Length : Uint4B +0x004 RootDirectory : Ptr32 Void +0x008 ObjectName : Ptr32 _UNICODE_STRING +0x00c Attributes : Uint4B +0x010 SecurityDescriptor : Ptr32 Void +0x014 SecurityQualityOfService : Ptr32 Void
對象總是創建在某個目錄中,這個目錄必須事先已經打開,當前進程必須擁有這個已打開目錄的句柄。這裏的字段RootDirectory就是這個目錄節點的句柄.
由OBJECT_ATTRIBUTES數據結構帶下來的某些信息最後進了目標對象頭部的OBJECT_HEADER和OBJECT_CREATE_INFORMATION數據結構。