在内核中之获取HKEY_CURRENT_USER对应路径
来源:互联网 发布:电商团队美工工资提成 编辑:程序博客网 时间:2024/06/07 04:43
在内核中操作注册表,HKEY_LOCAL_MACHINE的路径可以用\Registry\Machine来表示.
HKEY_USERS可以用\Registry\User表示.
而HKEY_CLASSES_ROOT和HKEY_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对应路径
- 【转】在内核中之获取HKEY_CURRENT_USER对应路径
- ASP.NET 中在SERVER侧获取虚拟路径对应的物理路径
- 在服务中模拟当前登录用户读取HKEY_CURRENT_USER
- HKEY_CURRENT_USER下在服务中注册自启动exe
- 服务中访问 HKEY_CURRENT_USER
- 内核中获取进程路径学习
- 内核中获取进程路径学习
- 在ubuntu下获取对应内核源码命令
- 在ubuntu下获取对应内核源码命令
- Android之根据图片的Uri获取对应的路径
- 获取u盘挂载对应路径
- 关于在XML中根据路径查找对应元素
- 在Java中获取系统路径属性
- 在驱动中获取进程全路径
- 在应用中获取路径的问题.
- 在VC中获取特定的路径
- 【C#】在C#中获取相对路径
- 2015.07.17总结
- LeetCode——Binary Tree Preorder Traversal
- WebService接口与HTTP接口的联系
- finish()不能是应用程序完全退出,下面这个方法可以
- Bluetooth 初识
- 在内核中之获取HKEY_CURRENT_USER对应路径
- 通过Clipboard传递数据
- how to get rid of the UITabBarItem padding
- openerp学习笔记 数据合法性约束(对象约束+数据库约束)
- jffs2,yaffs2,logfs,ubifs文件系统性能分析
- AndroidStudio中的包管理
- java:快速文件分割及合并
- ubifs文件系统的移植
- HDU 1281 棋盘游戏