• 【旧文章搬运】炉子给的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下肯定不对,系统差距太大了)

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

    后记:这个类型表在每个系统里都不一样,在之后的文章里,会有更深入的一些分析

  • 相关阅读:
    Codeforces Round #551 (Div. 2) F. Serval and Bonus Problem (DP/FFT)
    Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)
    BZOJ 5495: [2019省队联测]异或粽子 (trie树)
    洛谷【P2669】NOIP2015普及组 T1金币
    解决Win 10上SSD缓慢问题
    如何保障数据安全
    一个网工的linux学习过程
    JS实现select去除option的使用注意事项
    codevs1506传话(kosaraju算法)
    我的园子
  • 原文地址:https://www.cnblogs.com/achillis/p/10180826.html
Copyright © 2020-2023  润新知