1. 程式人生 > >【舊文章搬運】爐子給的SYSTEM_HANDLE_TYPE有點錯誤

【舊文章搬運】爐子給的SYSTEM_HANDLE_TYPE有點錯誤

原文發表於百度空間,2008-12-03
==========================================================================

今天寫程式,用ZwQuerySystemInformation列舉系統中的檔案控制代碼時出了問題,死活一個都找不到,可是這明顯不可能啊?於是用Process Explorer隨便找了個檔案控制代碼物件,然後看了它的OBJECT_TYPE,才發現檔案控制代碼的型別索引應為28,而我用的是爐子給的那個SYSTEM_HANDLE_TYPE表,裡面給的值卻是26!怪不得一個也找不到呢。於是,就花了點時間把這個型別索引給修正了一下,並且把幾個UNKNOW的給補充了出來,以後用起來就方便了嘛~

所謂的控制代碼索引,其實就是下面這個控制代碼資訊結構中的ObjectTypeNumber:

typedef struct _SYSTEM_HANDLE_INFORMATION {
ULONG ProcessId;
UCHAR ObjectTypeNumber;//其實就個
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

而這個東西,也就是OBJECT_TYPE結構中的Index而已,所以叫它索引......

typedef struct _OBJECT_TYPE {
    ERESOURCE Mutex;
    LIST_ENTRY TypeList;
    UNICODE_STRING Name;            // Copy from object header for convenience
    PVOID DefaultObject;
    ULONG Index;
    ULONG TotalNumberOfObjects;
    ULONG TotalNumberOfHandles;
    ULONG HighWaterNumberOfObjects;
    ULONG HighWaterNumberOfHandles;
    OBJECT_TYPE_INITIALIZER TypeInfo;
#ifdef POOL_TAGGING
    ULONG Key;
#endif //POOL_TAGGING ERESOURCE ObjectLocks[ OBJECT_LOCK_COUNT ]; } OBJECT_TYPE, *POBJECT_TYPE;

 

下面給出我修正後的,也補充了一些內容:

typedef enum _SYSTEM_HANDLE_TYPE
{
   OB_TYPE_UNKNOWN=0,   //0
   OB_TYPE_TYPE,    // 1,fixed
   OB_TYPE_DIRECTORY,   // 2,fixed
   OB_TYPE_SYMBOLIC_LINK, // 3,fixed
   OB_TYPE_TOKEN,    // 4,fixed
   OB_TYPE_PROCESS,   // 5,fixed
   OB_TYPE_THREAD,    // 6,fixed
   OB_TYPE_JOB,    // 7,fixed
   OB_TYPE_DEBUG_OBJECT, // 8,fixed
   OB_TYPE_EVENT,    // 9,fixed
   OB_TYPE_EVENT_PAIR,   //10,fixed
   OB_TYPE_MUTANT,    //11,fixed
   OB_TYPE_CALLBACK,   //12,fixed
   OB_TYPE_SEMAPHORE,   //13,fixed
   OB_TYPE_TIMER,    //14,fixed
   OB_TYPE_PROFILE,   //15,fixed
   OB_TYPE_KEYED_EVENT, //16,fixed
   OB_TYPE_WINDOWS_STATION,//17,fixed
   OB_TYPE_DESKTOP,   //18,fixed
   OB_TYPE_SECTION,   //19,fixed
   OB_TYPE_KEY,    //20,fixed
   OB_TYPE_PORT,    //21,fixed 
   OB_TYPE_WAITABLE_PORT, //22,fixed
   OB_TYPE_ADAPTER,   //23,fixed
   OB_TYPE_CONTROLLER,   //24,fixed
   OB_TYPE_DEVICE,    //25,fixed
   OB_TYPE_DRIVER,    //26,fixed
   OB_TYPE_IOCOMPLETION, //27,fixed
   OB_TYPE_FILE,    //28,fixed
   OB_TYPE_WMIGUID    //29,fixed
}SYSTEM_HANDLE_TYPE;

 

這回就全了。網上找了一下,用到這個列舉的基本都和爐子的LzOpenProcess有關,而那裡面只用了OB_TYPE_PROCESS,而這個是對的,其它的估計也沒多少人注意,也沒什麼人用到,所以網上傳的基本都是爐子那個不完全正確版本。

ps:後來仔細在WRK中看了一下這個Index 的生成過程,又學到點新東西,原來物件型別也是一種物件,叫做ObpTypeObjectType,就像我們熟知的PsProcessType,PsThreadType一樣。而這個索引並不是固定的,而是系統根據需要呼叫ObCreateObjectType時動態生成的(不過對於某一固定版本的系統,這個應該是固定的吧),所以ObpTypeObjectType的物件計數就是系統中所有物件型別的個數......

最後宣告一下,這個型別表是我在XP SP2下搞出來的,誰有時間幫我驗證下在別的系統上對不對~(估計在Vista下肯定不對,系統差距太大了)

=========================================================================================================================

後記:這個型別表在每個系統裡都不一樣,在之後的文章裡,會有更深入的一些分析