【转】在内核中之获取HKEY_CURRENT_USER对应路径

wesley心得,HKEY_CLASSES_ROOT路径下的注册表项(Local Settings),是由LocalMachine和users合并而成,并且users在前。

转载http://www.52pojie.cn/thread-30366-1-1.html

在内核中操作注册表,HKEY_LOCAL_MACHINE的路径可以用\Registry\Machine来表示.

HKEY_USERS可以用 \Registry\User表示.

HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIG,HKEY_CURRENT_USER,在内核没有对应的路径来表示.

实际上HKEY_CLASSES_ROOT是链接到HKEY_LOCAL_MACHINE\SOFTWARE\Classes

HKEY_CURRENT_CONFIG是链接到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current

可以这么理解为:

HKEY_CLASSES_ROOT = HKEY_LOCAL_MACHINE\SOFTWARE\Classes

HKEY_CURRENT_CONFIG = HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current

因为用户态的程序是由系统当前登录用户运行,而内核态的程序是由system用户运行,而HKEY_CURRENT_USER保存系统当前登录用户的相关信息,所以在内核中,无法直接访问HKEY_CURRENT_USER.

但实际上,HKEY_CURRENT_USER也是链接到HKEY_USERS\[当前登录用户的SID],在这里主要说一下在内核中怎么获取到当前登录用户的SID,获取的方法几种,比如,先Attach到当前登录用户运行的进程,然后再调用RtlFormatCurrentUserKeyPath,或者在Ring3与驱动通信例程中获取等,当然,这里只是其中的一个比较搓的方法.

打开在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList,可以看到几个以SID命名的注册表项,例如S-1-5-18就是SYSTEM用户的SID,S-1-5-21-1606980848-854245398-839522115-500 就是当前登录的管理员账号的SID,详细的SID描述可以看一下微软的文档,http://support.microsoft.com/kb/243330,我们要的就是获取当前登录账号的SID,这样子基本上思路就有了,在内核中,我们可以用ZwEnumerateKey来枚举\Registry\Machine\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\下面的所有以SID命名的注册表项,然后在其中过滤出我们所需要的SID,我的过滤思路是,一般的系统登录管理账号的SID长度都是20个字节以上的,但如果是系统里存在多个管理用户账号的情况,又如何判断那个才是当前登录账号呢?呵呵,这时可以利用ProfileList项下的RefCount键值来进行判断,如果RefCount大于0的话,那就说明这个用户账号是当前登录账号.

[cpp]  view plain  copy
  1. /******************************************* 
  2.   
  3. 函数说明:在内核中获取HKEY_CURRENT_USER路径 
  4.   
  5. Code:zzage 
  6.   
  7. From:http://hi.baidu.com/zzage 
  8.   
  9. ********************************************/  
  10.    
  11. VOID GetCurrentUser()  
  12.    
  13. {  
  14.    
  15. HANDLE hRegister;  
  16.    
  17. OBJECT_ATTRIBUTES ObjectAttributes;  
  18.    
  19. ULONG ulSize;  
  20.    
  21. PKEY_FULL_INFORMATION pfi;  
  22.    
  23. ULONG i;  
  24.    
  25. PKEY_BASIC_INFORMATION pbi;  
  26.    
  27. UNICODE_STRING uniKeyName;  
  28.    
  29. WCHAR CurrentUserbuf[256];  
  30.    
  31. WCHAR ProfileListbuf[256];  
  32.    
  33. UNICODE_STRING RegCurrentUser,RegUser;  
  34.    
  35. UNICODE_STRING RegProfileList,RegProf;  
  36.    
  37. RTL_QUERY_REGISTRY_TABLE paramTable[2];  
  38.    
  39. ULONG udefaultData=0;  
  40.    
  41. ULONG uQueryValue;  
  42.    
  43.   
  44. RtlZeroMemory(paramTable,sizeof(paramTable));  
  45.    
  46.   
  47. paramTable[0].Flags=RTL_QUERY_REGISTRY_DIRECT;  
  48.    
  49. paramTable[0].Name=L"RefCount";  
  50.    
  51. paramTable[0].EntryContext=&uQueryValue;  
  52.    
  53. paramTable[0].DefaultType=REG_DWORD;  
  54.    
  55. paramTable[0].DefaultData=&udefaultData;  
  56.    
  57. paramTable[0].DefaultLength=sizeof(ULONG);  
  58.    
  59.     
  60.    
  61.     
  62.    
  63. RtlInitUnicodeString(&RegProf,L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\");  
  64.    
  65. RtlInitUnicodeString(&RegUser,L"\\Registry\\User\\");   
  66.   
  67. RtlInitEmptyUnicodeString(&RegCurrentUser,CurrentUserbuf,256*sizeof(WCHAR));  
  68.    
  69. RtlInitEmptyUnicodeString(&RegProfileList,ProfileListbuf,256*sizeof(WCHAR));  
  70.    
  71.      
  72.    
  73. RtlCopyUnicodeString(&RegCurrentUser,&RegUser);  
  74.    
  75. RtlCopyUnicodeString(&RegProfileList,&RegProf);  
  76.    
  77.   
  78. InitializeObjectAttributes(&ObjectAttributes,&RegProf,OBJ_CASE_INSENSITIVE,NULL,NULL);  
  79.    
  80.   
  81. ZwOpenKey(&hRegister,KEY_ALL_ACCESS,&ObjectAttributes);  
  82.    
  83.   
  84. ZwQueryKey(hRegister,KeyFullInformation,NULL,0,&ulSize);  
  85.    
  86.   
  87. pfi=(PKEY_FULL_INFORMATION)ExAllocatePool(PagedPool,ulSize);  
  88.    
  89.   
  90. ZwQueryKey(hRegister,KeyFullInformation,pfi,ulSize,&ulSize);  
  91.    
  92.   
  93.   
  94. for (i=0;i<pfi->SubKeys;i++)  
  95.    
  96. {  
  97.    
  98.    ZwEnumerateKey(hRegister,  
  99.    
  100.     i,  
  101.    
  102.     KeyBasicInformation,  
  103.    
  104.     NULL,  
  105.    
  106.     0,  
  107.    
  108.     &ulSize);  
  109.    
  110.   
  111.    pbi =(PKEY_BASIC_INFORMATION)ExAllocatePool(PagedPool,ulSize);  
  112.    
  113.     
  114.    
  115.    ZwEnumerateKey(hRegister,  
  116.    
  117.     i,  
  118.    
  119.     KeyBasicInformation,  
  120.    
  121.     pbi,  
  122.    
  123.     ulSize,  
  124.    
  125.     &ulSize);  
  126.    
  127.   
  128.   
  129.    uniKeyName.Length =   
  130.    uniKeyName.MaximumLength =(USHORT)pbi->NameLength;  
  131.    
  132.    uniKeyName.Buffer = pbi->Name;  
  133.    
  134.   
  135.    if (pbi->NameLength>20)  
  136.    
  137.    {  
  138.    
  139.   
  140.   
  141.          RtlAppendUnicodeStringToString(&RegCurrentUser,&uniKeyName);  
  142.    
  143.             RtlAppendUnicodeStringToString(&RegProfileList,&uniKeyName);  
  144.    
  145.             RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,RegProfileList.Buffer,paramTable,NULL,NULL);  
  146.    
  147.       if (uQueryValue>0)  
  148.    
  149.     {  
  150.    
  151.       KdPrint(("HKET_CURRENT_USER: %wZ\n",&RegCurrentUser));  
  152.    
  153.     }  
  154.    
  155.   
  156.    }  
  157.    
  158.   
  159.   
  160.    RtlCopyUnicodeString(&RegCurrentUser,&RegUser);  
  161.    
  162.    RtlCopyUnicodeString(&RegProfileList,&RegProf);  
  163.    
  164.     
  165.    
  166. }  
  167.    
  168. ExFreePool(pbi);  
  169.    
  170. ExFreePool(pfi);  
  171.    
  172. ZwClose(hRegister);  
  173.    
  174.       
  175. }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值