本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 7306|回复: 7

获取OB_TYPE的一个方法,各版本通用 [复制链接]

Rank: 2

发表于 2011-12-9 15:09:40 |显示全部楼层
看了SYSTEM_HANDLE_INFORMATION里面的ObjectTypeNumber成员,一直在源码种找不到它的定义,网上找到了半天,然后对比又对不上号……
目前比较靠谱的就是achillis大年的
http://hi.baidu.com/_achillis/bl ... 745ad8a8ec9a69.html

不过他说vista以后的可能不一样(我也没试验过),索性写了一份来专门打印出来的代码。
  1. #define ObjectNameInformation        1

  2. #define SystemHandleInformation 0x10

  3. typedef struct _SYSTEM_HANDLE_INFORMATION {
  4.         ULONG ProcessId;
  5.         UCHAR ObjectTypeNumber;
  6.         UCHAR Flags;
  7.         USHORT Handle;
  8.         PVOID Object;
  9.         ACCESS_MASK GrantedAccess;
  10. } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

  11. typedef struct _SYSTEM_HANDLE_INFORMATION_EX {
  12.         ULONG NumberOfHandles;
  13.         SYSTEM_HANDLE_INFORMATION Information[1];
  14. } SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;

  15. NTSTATUS ZwQuerySystemInformation(
  16.         IN ULONG SystemInformationClass,
  17.         IN PVOID SystemInformation,
  18.         IN ULONG SystemInformationLength,
  19.         OUT PULONG ReturnLength);
  20. /*
  21. NTSTATUS ZwDuplicateObject(
  22.         IN HANDLE                                SourceProcessHandle,
  23.         IN PHANDLE                                SourceHandle,
  24.         IN HANDLE                                TargetProcessHandle,
  25.         OUT PHANDLE                                TargetHandle,
  26.         IN ACCESS_MASK                        DesiredAccess OPTIONAL,
  27.         IN BOOLEAN                                InheritHandle,
  28.         IN ULONG                                Options );

  29. NTSTATUS ZwQueryObject(
  30.         IN HANDLE                ObjectHandle,
  31.         IN ULONG                 ObjectInformationClass,
  32.         OUT PVOID                ObjectInformation,
  33.         IN ULONG                 ObjectInformationLength,
  34.         OUT PULONG               ReturnLength OPTIONAL);

  35. NTSTATUS PsLookupProcessByProcessId(
  36.         IN ULONG               ulProcId,
  37.         OUT PEPROCESS *        pEProcess);

  38. NTSTATUS KeAttachProcess(PEPROCESS pPeb);
  39. NTSTATUS KeDetachProcess();
  40. */

  41. PVOID GetInfoTable(ULONG ATableType)
  42. {
  43.         ULONG mSize = 0x4000;
  44.         PVOID mPtr = NULL;
  45.         NTSTATUS St;

  46.         do
  47.         {
  48.                 mPtr = ExAllocatePoolWithTag(PagedPool, mSize, 'ACEK');
  49.                 memset(mPtr, 0, mSize);
  50.                 if (mPtr)
  51.                 {
  52.                         St = ZwQuerySystemInformation(ATableType, mPtr, mSize, NULL);
  53.                 } else return NULL;
  54.                 if (St == STATUS_INFO_LENGTH_MISMATCH)
  55.                 {
  56.                         ExFreePoolWithTag(mPtr, 'ACEK');
  57.                         mSize = mSize * 2;
  58.                 }
  59.         } while (St == STATUS_INFO_LENGTH_MISMATCH);
  60.         if (St == STATUS_SUCCESS) return mPtr;
  61.         ExFreePool(mPtr);
  62.         return NULL;
  63. }

  64. typedef struct _OBJECT_TYPE_INDEX {
  65.         WCHAR        Format[0x40];
  66. }OBJECT_TYPE_INDEX, *POBJECT_TYPE_INDEX;

  67. OBJECT_TYPE_INDEX TypeIndex[0x20] = { 0 };

  68. void ObjectTypeFormat( ULONG Type, WCHAR * FormatName )
  69. {
  70.         if (Type >= 0x20) {
  71.                
  72.                 return;
  73.         }
  74.         if (TypeIndex[Type].Format[0] == 0) {
  75.                
  76.                 RtlStringCbPrintfW(
  77.                         TypeIndex[Type].Format,
  78.                         0x40,
  79.                         L"OB_TYPE_%s",
  80.                         FormatName
  81.                         );
  82.         }
  83. }

  84. void ObjectTypeDbgPrint()
  85. {
  86.         ULONG i = 0;
  87.         for (i = 0; i < 30; i++) {
  88.                
  89.                 if (TypeIndex[i].Format[0] == 0) {
  90.                        
  91.                         DbgPrint("#define OB_TYPE_UNKNOWN        %d\n", i);
  92.                 } else {
  93.                         _wcsupr(TypeIndex[i].Format);
  94.                         DbgPrint("#define %S        %d\n", TypeIndex[i].Format, i);
  95.                 }
  96.         }
  97. }

  98. HANDLE TestTable()
  99. {
  100.         HANDLE Process, hObject;
  101.         HANDLE CsrId = (HANDLE)0;
  102.         OBJECT_ATTRIBUTES obj;
  103.         CLIENT_ID cid;
  104.         UCHAR Buff[0x100];
  105.         POBJECT_NAME_INFORMATION ObjName = (PVOID)&Buff;
  106.         PSYSTEM_HANDLE_INFORMATION_EX Handles;
  107.         ULONG r;
  108.        
  109.         ULONG        i;
  110.        
  111.         Handles = GetInfoTable(SystemHandleInformation);

  112.         if (!Handles) return CsrId;

  113.         for (r = 0; r < Handles->NumberOfHandles; r++)
  114.         {
  115.                 {
  116.                         InitializeObjectAttributes(&obj, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);

  117.                         cid.UniqueProcess = (HANDLE)Handles->Information[r].ProcessId;
  118.                         cid.UniqueThread = 0;

  119.                         if (NT_SUCCESS(NtOpenProcess(&Process, PROCESS_DUP_HANDLE, &obj, &cid)))
  120.                         {
  121.                                 if (NT_SUCCESS(ZwDuplicateObject(
  122.                                         Process,
  123.                                         (HANDLE)Handles->Information[r].Handle,
  124.                                         NtCurrentProcess(), &hObject, 0, 0, DUPLICATE_SAME_ACCESS)))
  125.                                 {
  126.                                         PPUBLIC_OBJECT_TYPE_INFORMATION uoti = (PPUBLIC_OBJECT_TYPE_INFORMATION)NULL;
  127.                                         uoti = (PPUBLIC_OBJECT_TYPE_INFORMATION)ExAllocatePoolWithTag(
  128.                                                 NonPagedPool, sizeof(PUBLIC_OBJECT_TYPE_INFORMATION) + 0x100, 'ACEK' );
  129.                                         if (!uoti) {
  130.                                                
  131.                                                 return 0;
  132.                                         }
  133.                                         RtlZeroMemory( uoti, sizeof(PUBLIC_OBJECT_TYPE_INFORMATION) + 0x100 );
  134.                                         if (NT_SUCCESS(ZwQueryObject(hObject, ObjectTypeInformation, uoti, sizeof(PUBLIC_OBJECT_TYPE_INFORMATION) + 0x100, NULL))) {
  135.                                                
  136.                                                 //ANSI_STRING AnsiFormat = { 0 };
  137.                                                 //KdPrint(("%wZ = %d\n", &uoti->TypeName, Handles->Information[r].ObjectTypeNumber));
  138.                                                 //if (NT_SUCCESS(ZwQueryObject(hObject, ObjectNameInformation, ObjName, 0x100, NULL)))
  139.                                                 //{
  140.                                                         //KdPrint(("TestTable: Number = %d, %wZ, ObjectName = %wZ\n",
  141.                                                         //        Handles->Information[r].ObjectTypeNumber, &uoti->TypeName, &ObjName->Name));
  142.                                                 //}       
  143.                                                 //RtlUnicodeStringToAnsiString( &AnsiFormat, &uoti->TypeName, TRUE);
  144.                                                 ObjectTypeFormat( Handles->Information[r].ObjectTypeNumber, uoti->TypeName.Buffer );
  145.                                                 //RtlFreeAnsiString( &AnsiFormat );
  146.                                         }
  147.                                         ExFreePoolWithTag( uoti, 'ACEK' );
  148.                                         ZwClose(hObject);
  149.                                 }
  150.                                 ZwClose(Process);
  151.                         }
  152.                 }
  153.         }

  154.         ObjectTypeDbgPrint();

  155.         ExFreePool(Handles);
  156.         return CsrId;
  157. }
复制代码
结果如下:

#define OB_TYPE_UNKNOWN        0
#define OB_TYPE_UNKNOWN        1
#define OB_TYPE_DIRECTORY        2
#define OB_TYPE_SYMBOLICLINK        3
#define OB_TYPE_TOKEN        4
#define OB_TYPE_PROCESS        5
#define OB_TYPE_THREAD        6
#define OB_TYPE_JOB        7
#define OB_TYPE_UNKNOWN        8
#define OB_TYPE_EVENT        9
#define OB_TYPE_UNKNOWN        10
#define OB_TYPE_MUTANT        11
#define OB_TYPE_UNKNOWN        12
#define OB_TYPE_SEMAPHORE        13
#define OB_TYPE_TIMER        14
#define OB_TYPE_UNKNOWN        15
#define OB_TYPE_KEYEDEVENT        16
#define OB_TYPE_WINDOWSTATION        17
#define OB_TYPE_DESKTOP        18
#define OB_TYPE_SECTION        19
#define OB_TYPE_KEY        20
#define OB_TYPE_PORT        21
#define OB_TYPE_WAITABLEPORT        22
#define OB_TYPE_UNKNOWN        23
#define OB_TYPE_UNKNOWN        24
#define OB_TYPE_UNKNOWN        25
#define OB_TYPE_UNKNOWN        26
#define OB_TYPE_IOCOMPLETION        27
#define OB_TYPE_FILE        28
#define OB_TYPE_WMIGUID        29

当然有些OB_TYPE在我机子上没有对应的handle,所以也只能是unknow来显示了
另外给一份achillis大牛xp sp2下的
typedef enum _SYSTEM_HANDLE_TYPE
{
   OB_TYPE_UNKNOWN=0,                // 0
   OB_TYPE_TYPE,                        // 1,fixed
   OB_TYPE_DIRECTORY,                // 2,fixed -> \\KnownDlls + \\Windows + \\BaseNamedObjects
   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 -> \BaseNamedObjects\WmiProviderSubSystemHostJob
   OB_TYPE_DEBUG_OBJECT,        // 8,fixed
   OB_TYPE_EVENT,                        // 9,fixed -> \\BaseNamedObjects\\TpVcW32ListEvent + \\Security\\TRKWKS_EVENT
   OB_TYPE_EVENT_PAIR,                //10,fixed
   OB_TYPE_MUTANT,                        //11,fixed -> \\BaseNamedObjects\\ShimCacheMutex
   OB_TYPE_CALLBACK,                //12,fixed ->
   OB_TYPE_SEMAPHORE,                //13,fixed -> \\BaseNamedObjects\\shell.{A48F1A32-A340-11D1-BC6B-00A0C90312E1}
   OB_TYPE_TIMER,                        //14,fixed -> \\BaseNamedObjects\\userenv: refresh timer for 624:1460 + \\BaseNamedObjects\\userenv: refresh timer for 624:1576
   OB_TYPE_PROFILE,                        //15,fixed
   OB_TYPE_KEYED_EVENT,                //16,fixed -> \\KernelObjects\\CritSecOutOfMemoryEvent
   OB_TYPE_WINDOWS_STATION,        //17,fixed -> \\Windows\\WindowStations\WinSta0 + \\Windows\\WindowStations\\Service-0x0-3e7$
   OB_TYPE_DESKTOP,                        //18,fixed -> \\Default + \\Disconnect + \\Winlogon
   OB_TYPE_SECTION,                        //19,fixed -> \\BaseNamedObjects\\ShimSharedMemory
   OB_TYPE_KEY,                                //20,fixed -> \\REGISTRY\\USER
   OB_TYPE_PORT,                        //21,fixed -> \\Windows\\ApiPort + \\FusApiPort
   OB_TYPE_WAITABLE_PORT,        //22,fixed -> \\\NLAPrivatePort + \\Security\\TRKWKS_PORT
   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 -> \\Dfs  + \\Device\\KSENUM#00000001 + \\Device\\Tcp
   OB_TYPE_WMIGUID                        //29,fixed
}SYSTEM_HANDLE_TYPE;

Rank: 2

发表于 2011-12-9 18:38:10 |显示全部楼层
\ObjectTypes里面有所有的类型

Rank: 4

发表于 2011-12-9 20:30:45 |显示全部楼层
Vista的对象管理跟以前差不多一样的,Win7就组织得更有序也更简单了,全部放一个表里去了。。。

Rank: 4

发表于 2011-12-9 20:34:12 |显示全部楼层
而且这个东西在源码里是没有定义的,就是创建ObjectType时的一个先后顺序排序而已,不过Windows启动时每次干的事基本都一样,所以创建对象类型的顺序也就一直这样了,看起来就像是固定的~

Rank: 3Rank: 3

发表于 2011-12-9 22:21:43 |显示全部楼层
好漂亮的女儿!

Rank: 2

发表于 2011-12-12 09:18:01 |显示全部楼层
achillis 发表于 2011-12-9 20:34
而且这个东西在源码里是没有定义的,就是创建ObjectType时的一个先后顺序排序而已,不过Windows启动时每次 ...

牛人,很久不见啦。
也很久没有发贴让我们学习啦

Rank: 1

发表于 2011-12-14 13:38:08 |显示全部楼层
这个。。。。。最好不要搞字符串。。。。其实有更简单的办法,就是,先在自己进程里create一个你需要查询type number的句柄

然后,QuerySystemInfo(SysHandleInfo,.............),

然后在获得的系统句柄表里寻找本进程的句柄,并且比较句柄值,或者比较object的值。。。一样的话,那object type number就找到了

这个要简单多了

Rank: 1

发表于 2012-7-13 23:07:48 |显示全部楼层
谢谢了 这次我的句柄表就完美了
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-5-22 01:45 , Processed in 0.046010 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部