找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 12807|回复: 10

自己实现ObReferenceObjectByHandle

 火.. [复制链接]

47

主题

265

回帖

8

精华

核心会员

积分
10349
发表于 2011-4-7 18:45:58 | 显示全部楼层 |阅读模式
比较简单,就是根据内核句柄表,再根据句柄表的一些结构,自己查找就是了。
查找部分直接从WRK里扣出来的。
怎么得到内核句柄表,看代码,抹句柄已经很正常了。

  1. #include <ntddk.h>
  2. #include <windef.h>

  3. NTSTATUS
  4.   DriverEntry(
  5.         IN PDRIVER_OBJECT  DriverObject,
  6.         IN PUNICODE_STRING  RegistryPath
  7.         );

  8. NTSYSAPI
  9. NTSTATUS
  10. NTAPI
  11. ZwOpenDirectoryObject(
  12.         OUT PHANDLE DirectoryHandle,
  13.         IN ACCESS_MASK DesiredAccess,
  14.         IN POBJECT_ATTRIBUTES ObjectAttributes
  15.         );

  16. #pragma alloc_text(INIT ,DriverEntry)

  17. /////////////////////
  18. //struct
  19. ////////////////////
  20. #define TABLE_PAGE_SIZE PAGE_SIZE
  21. #define LEVEL_CODE_MASK 3
  22. #define LOWLEVEL_COUNT (TABLE_PAGE_SIZE / sizeof(HANDLE_TABLE_ENTRY))
  23. #define MIDLEVEL_COUNT (PAGE_SIZE / sizeof(PHANDLE_TABLE_ENTRY))
  24. #define HIGHLEVEL_COUNT  MAX_HANDLES / (LOWLEVEL_COUNT * MIDLEVEL_COUNT)

  25. typedef struct _EX_PUSH_LOCK {

  26. #define EX_PUSH_LOCK_LOCK_V          ((ULONG_PTR)0x0)
  27. #define EX_PUSH_LOCK_LOCK            ((ULONG_PTR)0x1)


  28. #define EX_PUSH_LOCK_WAITING         ((ULONG_PTR)0x2)

  29. #define EX_PUSH_LOCK_WAKING          ((ULONG_PTR)0x4)

  30. #define EX_PUSH_LOCK_MULTIPLE_SHARED ((ULONG_PTR)0x8)

  31. #define EX_PUSH_LOCK_SHARE_INC       ((ULONG_PTR)0x10)
  32. #define EX_PUSH_LOCK_PTR_BITS        ((ULONG_PTR)0xf)

  33.     union {
  34.         struct {
  35.             ULONG_PTR Locked         : 1;
  36.             ULONG_PTR Waiting        : 1;
  37.             ULONG_PTR Waking         : 1;
  38.             ULONG_PTR MultipleShared : 1;
  39.             ULONG_PTR Shared         : sizeof (ULONG_PTR) * 8 - 4;
  40.         };
  41.         ULONG_PTR Value;
  42.         PVOID Ptr;
  43.     };
  44. } EX_PUSH_LOCK, *PEX_PUSH_LOCK;

  45. typedef struct _HANDLE_TABLE {

  46.     ULONG_PTR TableCode;

  47.     struct _EPROCESS *QuotaProcess;
  48.     HANDLE UniqueProcessId;

  49. #define HANDLE_TABLE_LOCKS 4

  50.     EX_PUSH_LOCK HandleTableLock[HANDLE_TABLE_LOCKS];

  51.     LIST_ENTRY HandleTableList;

  52.     EX_PUSH_LOCK HandleContentionEvent;

  53.     PVOID DebugInfo;

  54.     LONG ExtraInfoPages;

  55.     ULONG FirstFree;

  56.     ULONG LastFree;

  57.     ULONG NextHandleNeedingPool;

  58.     LONG HandleCount;

  59.     union {
  60.         ULONG Flags;

  61.         BOOLEAN StrictFIFO : 1;
  62.     };

  63. } HANDLE_TABLE, *PHANDLE_TABLE;

  64. typedef struct _EXHANDLE {

  65.     union {

  66.         struct {

  67.             ULONG TagBits : 2;

  68.             ULONG Index : 30;

  69.         };

  70.         HANDLE GenericHandleOverlay;

  71. #define HANDLE_VALUE_INC 4

  72.         ULONG_PTR Value;
  73.     };

  74. } EXHANDLE, *PEXHANDLE;

  75. typedef struct _HANDLE_TABLE_ENTRY {

  76.     union {

  77.         PVOID Object;

  78.         ULONG ObAttributes;

  79.         PVOID InfoTable;

  80.         ULONG_PTR Value;
  81.     };

  82.     union {

  83.         union {

  84.             ACCESS_MASK GrantedAccess;

  85.             struct {

  86.                 USHORT GrantedAccessIndex;
  87.                 USHORT CreatorBackTraceIndex;
  88.             };
  89.         };

  90.         LONG NextFreeTableEntry;
  91.     };

  92. } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;

  93. #define NUMBER_HASH_BUCKETS 37
  94. typedef struct _OBJECT_DIRECTORY_ENTRY {
  95.     struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
  96.     PVOID Object;
  97.     ULONG HashValue;
  98. } OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;

  99. typedef struct _OBJECT_DIRECTORY {
  100.     struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[ NUMBER_HASH_BUCKETS ];
  101.     EX_PUSH_LOCK Lock;
  102.     PVOID        DeviceMap;
  103.     ULONG SessionId;
  104. } OBJECT_DIRECTORY, *POBJECT_DIRECTORY;

  105. ///////////////////////////////
  106. //struct end
  107. //////////////////////////////

  108. VOID
  109.   DriverUnload(
  110.         IN PDRIVER_OBJECT  DriverObject
  111.         )
  112. {
  113. }

  114. NTSTATUS
  115.   DriverEntry(
  116.         IN PDRIVER_OBJECT  DriverObject,
  117.         IN PUNICODE_STRING  RegistryPath
  118.         )
  119. {
  120.         NTSTATUS                ntStatus;
  121.         POBJECT_DIRECTORY        dir_obj;
  122.         PVOID                        eprocess;        //eprocess的指针
  123.         PHANDLE_TABLE                HandleTable;        //指向句柄表的指针
  124.         ULONG_PTR                CapturedTable;
  125.         ULONG                        TableLevel;
  126.         PUCHAR                         TableLevel1;
  127.         PUCHAR                         TableLevel2;
  128.         PUCHAR                         TableLevel3;
  129.         EXHANDLE                 Handle;
  130.         HANDLE                        dir_handle;
  131.         ULONG_PTR                 i,j,k;
  132.         UNICODE_STRING                dir_name;
  133.         OBJECT_ATTRIBUTES        obj_attr;
  134.         PHANDLE_TABLE_ENTRY         Entry = NULL;
  135.        
  136.         //初始化驱动卸载例程
  137.         DriverObject->DriverUnload = DriverUnload;
  138.        
  139.         //取得内核句柄表的指针
  140.         eprocess = (PVOID)PsGetCurrentProcess();
  141.         HandleTable = (PHANDLE_TABLE)*(ULONG*)((ULONG)eprocess + 0x0c4); //0x0c4是eprocess里tablecode的偏移
  142.        
  143.         //获得根目录(\)的句柄
  144.         RtlInitUnicodeString( &dir_name, L"\");
  145.         InitializeObjectAttributes(
  146.                                 &obj_attr,
  147.                                 &dir_name,
  148.                                 OBJ_KERNEL_HANDLE,
  149.                                 NULL,
  150.                                 NULL);
  151.         ntStatus = ZwOpenDirectoryObject(
  152.                                 &dir_handle,
  153.                                 DIRECTORY_ALL_ACCESS,
  154.                                 &obj_attr);
  155.         if (!NT_SUCCESS(ntStatus)) {
  156.                 KdPrint(("GetRootDir @ DriverEntry : ZwOpenDirectoryObject error!\n"));
  157.                 ZwClose(dir_handle);
  158.                 return        STATUS_SUCCESS;
  159.         }
  160. /*方法二
  161.         ntStatus = ObReferenceObjectByHandle(
  162.                         dir_handle,
  163.                         DIRECTORY_ALL_ACCESS,
  164.                         NULL,
  165.                         KernelMode,
  166.                         &dir_obj,
  167.                         NULL);
  168.         if (!NT_SUCCESS(ntStatus)) {
  169.                 KdPrint(("GetRootDir @ DriverEntry : ObReferenceObjectByHandle error!\n"));
  170.                 ObDereferenceObject( dir_obj );
  171.                 return STATUS_SUCCESS;
  172.         }
  173. */       
  174.         //开始从内核句柄表中查找我们句柄所对应的对象
  175.         Handle.GenericHandleOverlay = dir_handle;
  176.         Handle.TagBits = 0;
  177.        
  178.         CapturedTable = *(volatile ULONG_PTR *) &(HandleTable->TableCode);

  179.             //
  180.             //  we need to capture the current table. This routine is lock free
  181.             //  so another thread may change the table at HandleTable->TableCode
  182.             //

  183.         TableLevel = (ULONG)(CapturedTable & LEVEL_CODE_MASK);
  184.         CapturedTable = CapturedTable - TableLevel;

  185.             //
  186.             //  The lookup code depends on number of levels we have
  187.             //

  188.         switch (TableLevel) {
  189.                
  190.                 case 0:
  191.                     
  192.                     //
  193.                     //  We have a simple index into the array, for a single level
  194.                     //  handle table
  195.                     //


  196.                         TableLevel1 = (PUCHAR) CapturedTable;

  197.                     //
  198.                     // The index for this level is already scaled by a factor of 4. Take advantage of this
  199.                     //

  200.                         Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[Handle.Value *
  201.                                                                (sizeof (HANDLE_TABLE_ENTRY) / HANDLE_VALUE_INC)];

  202.                         break;
  203.                
  204.                 case 1:
  205.                     
  206.                     //
  207.                     //  we have a 2 level handle table. We need to get the upper index
  208.                     //  and lower index into the array
  209.                     //


  210.                         TableLevel2 = (PUCHAR) CapturedTable;

  211.                         i = Handle.Value % (LOWLEVEL_COUNT * HANDLE_VALUE_INC);

  212.                         Handle.Value -= i;
  213.                         j = Handle.Value / ((LOWLEVEL_COUNT * HANDLE_VALUE_INC) / sizeof (PHANDLE_TABLE_ENTRY));

  214.                         TableLevel1 =  (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel2[j];
  215.                         Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[i * (sizeof (HANDLE_TABLE_ENTRY) / HANDLE_VALUE_INC)];

  216.                         break;
  217.                
  218.                 case 2:
  219.                     
  220.                     //
  221.                     //  We have here a three level handle table.
  222.                     //


  223.                         TableLevel3 = (PUCHAR) CapturedTable;

  224.                         i = Handle.Value  % (LOWLEVEL_COUNT * HANDLE_VALUE_INC);

  225.                         Handle.Value -= i;

  226.                         k = Handle.Value / ((LOWLEVEL_COUNT * HANDLE_VALUE_INC) / sizeof (PHANDLE_TABLE_ENTRY));

  227.                         j = k % (MIDLEVEL_COUNT * sizeof (PHANDLE_TABLE_ENTRY));

  228.                         k -= j;

  229.                         k /= MIDLEVEL_COUNT;


  230.                         TableLevel2 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel3[k];
  231.                         TableLevel1 = (PUCHAR) *(PHANDLE_TABLE_ENTRY *) &TableLevel2[j];
  232.                         Entry = (PHANDLE_TABLE_ENTRY) &TableLevel1[i * (sizeof (HANDLE_TABLE_ENTRY) / HANDLE_VALUE_INC)];

  233.                         break;

  234.                 default :
  235.                         _assume (0);
  236.         }
  237.        
  238.         dir_obj = (POBJECT_DIRECTORY)((ULONG)((*(ULONG*)(Entry)) & 0xFFFFFFF8) + 0x18);

  239.         KdPrint(("GetRootDir @ DriverEntry : dir_obj is %08x\n", dir_obj));
  240.        
  241.         //调试版本此函数会起做用
  242.         //程序断在这里,方便调试
  243.         KdBreakPoint();
  244.        
  245.         return STATUS_SUCCESS;
  246. }
复制代码

评分

参与人数 1水晶币 +100 收起 理由
Tesla.Angela + 100 精品文章

查看全部评分

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2011-4-8 09:41:04 | 显示全部楼层
LZ貌似抄了不少WRK的代码

47

主题

265

回帖

8

精华

核心会员

积分
10349
 楼主| 发表于 2011-4-8 10:08:41 | 显示全部楼层
回复 乔丹二世 的帖子
查找部分直接从WRK里扣出来的。

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-4-8 10:35:40 | 显示全部楼层
如果做一款安全类软件或二次开发用的引擎,应该可以吧?
我就是嗷嗷叫的老马了......

47

主题

265

回帖

8

精华

核心会员

积分
10349
 楼主| 发表于 2011-4-8 11:44:31 | 显示全部楼层
回复 马大哈 的帖子

我?还是说这代码?

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-4-8 14:52:06 | 显示全部楼层
我说你们几个;P
我就是嗷嗷叫的老马了......

47

主题

265

回帖

8

精华

核心会员

积分
10349
 楼主| 发表于 2011-4-8 15:03:01 | 显示全部楼层
回复 马大哈 的帖子

管理员不是在做吗~哎~我还没人要呢~

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-4-8 18:17:53 | 显示全部楼层
回复 ywledoc 的帖子

是你处的地方不好。。。
来广东吧,广东这边的人比较务实,对于有用的人,也舍得出钱。

47

主题

265

回帖

8

精华

核心会员

积分
10349
 楼主| 发表于 2011-4-8 20:15:28 | 显示全部楼层
回复 Tesla.Angela 的帖子

也得要毕业以后啦~珠海或者深圳。

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2011-4-10 09:06:24 | 显示全部楼层
回复 ywledoc 的帖子

加油加油!!!
我就是嗷嗷叫的老马了......

0

主题

68

回帖

0

精华

铜牌会员

积分
94
发表于 2015-1-10 10:25:31 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表