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

Posted 125096

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在内核中之获取HKEY_CURRENT_USER对应路径相关的知识,希望对你有一定的参考价值。

在内核中操作注册表,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的话,那就说明这个用户账号是当前登录账号.

/*******************************************
 
函数说明:在内核中获取HKEY_CURRENT_USER路径
 
Code:zzage
 
From:http://hi.baidu.com/zzage
 
********************************************/
 
VOID GetCurrentUser()
 

 
HANDLE hRegister;
 
OBJECT_ATTRIBUTES ObjectAttributes;
 
ULONG ulSize;
 
PKEY_FULL_INFORMATION pfi;
 
ULONG i;
 
PKEY_BASIC_INFORMATION pbi;
 
UNICODE_STRING uniKeyName;
 
WCHAR CurrentUserbuf[256];
 
WCHAR ProfileListbuf[256];
 
UNICODE_STRING RegCurrentUser,RegUser;
 
UNICODE_STRING RegProfileList,RegProf;
 
RTL_QUERY_REGISTRY_TABLE paramTable[2];
 
ULONG udefaultData=0;
 
ULONG uQueryValue;
 

RtlZeroMemory(paramTable,sizeof(paramTable));
 

paramTable[0].Flags=RTL_QUERY_REGISTRY_DIRECT;
 
paramTable[0].Name=L"RefCount";
 
paramTable[0].EntryContext=&uQueryValue;
 
paramTable[0].DefaultType=REG_DWORD;
 
paramTable[0].DefaultData=&udefaultData;
 
paramTable[0].DefaultLength=sizeof(ULONG);
 
  
 
  
 
RtlInitUnicodeString(&RegProf,L"\\\\Registry\\\\Machine\\\\SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\ProfileList\\\\");
 
RtlInitUnicodeString(&RegUser,L"\\\\Registry\\\\User\\\\"); 

RtlInitEmptyUnicodeString(&RegCurrentUser,CurrentUserbuf,256*sizeof(WCHAR));
 
RtlInitEmptyUnicodeString(&RegProfileList,ProfileListbuf,256*sizeof(WCHAR));
 
   
 
RtlCopyUnicodeString(&RegCurrentUser,&RegUser);
 
RtlCopyUnicodeString(&RegProfileList,&RegProf);
 

InitializeObjectAttributes(&ObjectAttributes,&RegProf,OBJ_CASE_INSENSITIVE,NULL,NULL);
 

ZwOpenKey(&hRegister,KEY_ALL_ACCESS,&ObjectAttributes);
 

ZwQueryKey(hRegister,KeyFullInformation,NULL,0,&ulSize);
 

pfi=(PKEY_FULL_INFORMATION)ExAllocatePool(PagedPool,ulSize);
 

ZwQueryKey(hRegister,KeyFullInformation,pfi,ulSize,&ulSize);
 


for (i=0;i<pfi->SubKeys;i++)
 

 
   ZwEnumerateKey(hRegister,
 
    i,
 
    KeyBasicInformation,
 
    NULL,
 
    0,
 
    &ulSize);
 

   pbi =(PKEY_BASIC_INFORMATION)ExAllocatePool(PagedPool,ulSize);
 
  
 
   ZwEnumerateKey(hRegister,
 
    i,
 
    KeyBasicInformation,
 
    pbi,
 
    ulSize,
 
    &ulSize);
 


   uniKeyName.Length = 
   uniKeyName.MaximumLength =(USHORT)pbi->NameLength;
 
   uniKeyName.Buffer = pbi->Name;
 

   if (pbi->NameLength>20)
 
   
 


         RtlAppendUnicodeStringToString(&RegCurrentUser,&uniKeyName);
 
            RtlAppendUnicodeStringToString(&RegProfileList,&uniKeyName);
 
            RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,RegProfileList.Buffer,paramTable,NULL,NULL);
 
      if (uQueryValue>0)
 
    
 
      KdPrint(("HKET_CURRENT_USER: %wZ\\n",&RegCurrentUser));
 
    
 

   
 


   RtlCopyUnicodeString(&RegCurrentUser,&RegUser);
 
   RtlCopyUnicodeString(&RegProfileList,&RegProf);
 
  
 

 
ExFreePool(pbi);
 
ExFreePool(pfi);
 
ZwClose(hRegister);
 
    


 

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

 

以上是关于在内核中之获取HKEY_CURRENT_USER对应路径的主要内容,如果未能解决你的问题,请参考以下文章

如何启用 ASP.NET 对注册表项 'HKEY_CURRENT_USER\Software\myAppKey\subdir' 的写访问?

webbrowser 内核切换

Vue中之nextTick函数源码分析

重中之重-函数

当内核过多或多于一台机器时,Dataflow 无法获取对 BigQuery 表的引用

如何用C语言获取windows注册表信息