找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7252|回复: 6

CmRegisterCallbacks 获取注册表完整路径

[复制链接]

9

主题

32

回帖

0

精华

铜牌会员

积分
162
发表于 2012-12-31 16:11:06 | 显示全部楼层 |阅读模式
没办法 被逼自己研究了下,特此公开,目前只在WIN2003 SP2 下测试,WIN64 应该也可以

  1. //未公开结构申明  
  2. typedef struct _CM_KEY_BODY
  3. {
  4.         ULONG   Type;
  5.         PVOID   KeyControlBlock;
  6.         PVOID   NotifyBlock;
  7.         HANDLE  ProcessID;        // the owner process
  8.         LIST_ENTRY KeyBodyList;    // key_nodes using the same kcb
  9. } CM_KEY_BODY, *PCM_KEY_BODY;

  10. typedef struct _CM_NAME_CONTROL_BLOCK
  11. {
  12.         USHORT Compressed;
  13.         USHORT RefCount;
  14.         ULONG ConvKey;
  15.         void* NextHash;
  16.         USHORT  NameLength;
  17.         USHORT Name;
  18. } CM_NAME_CONTROL_BLOCK, *PCM_NAME_CONTROL_BLOCK;

  19. typedef struct _CM_KEY_CONTROL_BLOCK
  20. {
  21.         ULONG RefCount;
  22.         ULONG ExtFlags: 8;
  23.         ULONG PrivateAlloc: 1;
  24.         ULONG Delete: 1;
  25.         ULONG DelayedCloseIndex: 12;
  26.         ULONG TotalLevels: 10;
  27.         ULONG ConvKey;
  28.         void* NextHash;
  29.         void* KeyHive;
  30.         ULONG KeyCell;
  31.         void* ParentKcb;
  32.         void* NameBlock;
  33.         //...

  34. }CM_KEY_CONTROL_BLOCK, *PCM_KEY_CONTROL_BLOCK;

  35. //RegistryCallback 调用
  36. case RegNtPreCreateKeyEx:
  37.                         {
  38.                                 PREG_CREATE_KEY_INFORMATION createKey = (PREG_CREATE_KEY_INFORMATION)Argument2;

  39.                                 GetRegObjectCompletePath(createKey->RootObject, createKey->CompleteName, &registryPath);

  40.                                 KdPrint(("[xiaoc] RegNtPreCreateKeyEx %wZ",registryPath));  

  41.                                 enumType = REG_TYPE_CREATE;

  42.                                 if( RegFilter(enumType, &registryPath, &g_stCreateReg) )
  43.                                 {
  44.                                         ntReg = STATUS_ACCESS_DENIED;
  45.                                 }

  46.                                 break;
  47.                         }

  48. BOOLEAN GetRegObjectCompletePath(PVOID pObject,PUNICODE_STRING pKeyName, PUNICODE_STRING pRootPath)
  49. {
  50.         BOOLEAN bRet = FALSE;
  51.         PCM_KEY_BODY pKeyBody = NULL;
  52.         PCM_KEY_CONTROL_BLOCK pKeyControlBlock = NULL;
  53.         PCM_NAME_CONTROL_BLOCK pNameBlock = NULL;
  54.         ANSI_STRING aniPath;
  55.         char szBuf[MAX_LENGTH] = {0};
  56.         int  nLen = 0;

  57.         do
  58.         {
  59.                 if( !pObject || !MmIsAddressValid(pObject) )
  60.                 {
  61.                         RtlCopyUnicodeString(pRootPath, pKeyName);
  62.                         RtlAppendUnicodeToString(pRootPath, L"\");
  63.                         break;
  64.                 }

  65.                 pKeyBody = (PCM_KEY_BODY)pObject;

  66.                 pKeyControlBlock = (PCM_KEY_CONTROL_BLOCK)pKeyBody->KeyControlBlock;

  67.                 while(pKeyControlBlock)
  68.                 {
  69.                         pNameBlock = (PCM_NAME_CONTROL_BLOCK)pKeyControlBlock->NameBlock;

  70.                         if( nLen + pNameBlock->NameLength + 1 >= MAX_LENGTH )
  71.                         {
  72.                                 break;
  73.                         }                       

  74.                         RtlMoveMemory(szBuf + pNameBlock->NameLength + 1, szBuf, nLen);

  75.                         szBuf[0] = '\\';

  76.                         RtlCopyMemory(szBuf + 1, &pNameBlock->Name, pNameBlock->NameLength);

  77.                         nLen += pNameBlock->NameLength + 1;

  78.                         pKeyControlBlock = (PCM_KEY_CONTROL_BLOCK)pKeyControlBlock->ParentKcb;

  79.                         if( !MmIsAddressValid(pKeyControlBlock) )
  80.                         {
  81.                                 break;
  82.                         }
  83.                 }

  84.                 RtlInitAnsiString(&aniPath, szBuf);
  85.                 RtlAnsiStringToUnicodeString(pRootPath,&aniPath, FALSE);

  86.                 if(pKeyName && pKeyName->Buffer)
  87.                 {
  88.                         RtlAppendUnicodeToString(pRootPath, pKeyName);
  89.                         RtlAppendUnicodeToString(pRootPath, L"\");
  90.                 }

  91.                 bRet = TRUE;

  92.         } while (FALSE);

  93.         return bRet;
  94. }
复制代码

评分

参与人数 1水晶币 +60 收起 理由
Tesla.Angela + 60 很给力!

查看全部评分

857

主题

2632

回帖

2

精华

管理员

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

积分
36130
发表于 2012-12-31 20:23:17 | 显示全部楼层
不错,加分鼓励一下。

9

主题

32

回帖

0

精华

铜牌会员

积分
162
 楼主| 发表于 2013-1-5 16:26:04 | 显示全部楼层
WIN2008  和 WIN2003 _CM_KEY_CONTROL_BLOCK 结构居然不一样,坑爹了,肿么办。。。

  1. //win2003
  2. kd> dt nt!pKeyControlBlock
  3. Local var @ 0xfffff880040c1328 Type _CM_KEY_CONTROL_BLOCK*
  4. 0xfffff8a0`00022130
  5.    +0x000 RefCount         : 0x23
  6.    +0x004 ExtFlags         : 0y00000000 (0)
  7.    +0x004 PrivateAlloc     : 0y0
  8.    +0x004 Delete           : 0y0
  9.    +0x004 DelayedCloseIndex : 0y000001000000 (0x40)
  10.    +0x004 TotalLevels      : 0y0000000001 (0x1)
  11.    +0x008 ConvKey          : 0x01cb892b`9c18eb70
  12.    +0x010 NextHash         : 0x01cb892b`bd68092e
  13.    +0x018 KeyHive          : (null)
  14.    +0x020 KeyCell          : 0xfffff8a0`0000e010
  15.    +0x028 ParentKcb        : 0x00000000`00000120
  16.    +0x030 NameBlock        : (null)

  17. //win2008
  18. kd> dt nt!_CM_KEY_CONTROL_BLOCK 0xfffff8a0`00022130
  19.    +0x000 RefCount         : 0x23
  20.    +0x004 ExtFlags         : 0y0000000000000000 (0)
  21.    +0x004 PrivateAlloc     : 0y1
  22.    +0x004 Delete           : 0y0
  23.    +0x004 HiveUnloaded     : 0y0
  24.    +0x004 Decommissioned   : 0y0
  25.    +0x004 LockTablePresent : 0y0
  26.    +0x004 TotalLevels      : 0y0000000010 (0x2)
  27.    +0x008 DelayedDeref     : 0y0
  28.    +0x008 DelayedClose     : 0y0
  29.    +0x008 Parking          : 0y0
  30.    +0x010 KeyHash          : _CM_KEY_HASH
  31.    +0x010 ConvKey          : 0xbd68092e
  32.    +0x018 NextHash         : (null)
  33.    +0x020 KeyHive          : 0xfffff8a0`0000e010 _HHIVE
  34.    +0x028 KeyCell          : 0x120
  35.    +0x030 KcbPushlock      : _EX_PUSH_LOCK
  36.    +0x038 Owner            : (null)
  37.    +0x038 SharedCount      : 0
  38.    +0x040 SlotHint         : 0
  39.    +0x048 ParentKcb        : 0xfffff8a0`00022008 _CM_KEY_CONTROL_BLOCK
  40.    +0x050 NameBlock        : 0xfffff8a0`0000a700 _CM_NAME_CONTROL_BLOCK
  41.    +0x058 CachedSecurity   : 0xfffff8a0`00021420 _CM_KEY_SECURITY_CACHE
  42.    +0x060 ValueCache       : _CACHED_CHILD_LIST
  43.    +0x070 IndexHint        : 0x01cb892b`00000007 _CM_INDEX_HINT_BLOCK
  44.    +0x070 HashKey          : 7
  45.    +0x070 SubKeyCount      : 7
  46.    +0x078 KeyBodyListHead  : _LIST_ENTRY [ 0xfffff8a0`0153f2f0 - 0xfffff8a0`0253f3e0 ]
  47.    +0x078 FreeListEntry    : _LIST_ENTRY [ 0xfffff8a0`0153f2f0 - 0xfffff8a0`0253f3e0 ]
  48.    +0x088 KeyBodyArray     : [4] 0xfffff8a0`014332e0 _CM_KEY_BODY
复制代码

评分

参与人数 1水晶币 +2 收起 理由
Xor + 2 判断一下系统版本

查看全部评分

0

主题

44

回帖

0

精华

银牌会员

积分
427
发表于 2013-2-4 23:14:38 | 显示全部楼层
不用硬编码啊~可以有函数得到Object名字的~
  1. NTSTATUS
  2.   ObQueryNameString(
  3.     IN PVOID  Object,
  4.     OUT POBJECT_NAME_INFORMATION  ObjectNameInfo,
  5.     IN ULONG  Length,
  6.     OUT PULONG  ReturnLength
  7.     );
复制代码

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-7 15:34:37 | 显示全部楼层
32位元和64位元應該也不一樣才對

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-8 13:29:10 | 显示全部楼层
學習!!

7

主题

414

回帖

1

精华

铂金会员

积分
2173
发表于 2013-4-9 21:11:34 | 显示全部楼层
好東西!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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