正确使用RegOpenCurrentUser

Proper use of RegOpenCurrentUser

本文关键字:RegOpenCurrentUser      更新时间:2023-10-16

我去这里做了一个测试程序,看看它是否真的禁用了任务管理器。基本上是一个简单的布尔开关打开然后关闭以查看任务管理器是否真的被禁用。当我编译和运行它时,它按预期工作。

编辑:代码现在看起来像这样

#include <iostream>
#include <Windows.h>
using namespace std;
void LockTaskManager(bool Lock);
void main(void) {
LockTaskManager(true);
cout << "Testing task manager disable." << endl;
getchar();
LockTaskManager(false);
cout << "Testing task manager enabled." << endl;
getchar();
}
void LockTaskManager(bool Lock)
{
HKEY currKey;
DWORD dwDisposition;
DWORD dwType, dwSize;
DWORD value;
if (Lock)
value = 1;
else
value = 0;
LRESULT lResult = RegOpenCurrentUser(KEY_WRITE, &currKey);
if (RegCreateKeyEx(currKey,
TEXT("Software\Microsoft\Windows\CurrentVersion\Policies\system"),
0,
NULL,
0,
KEY_SET_VALUE,
NULL,
&currKey,
&dwDisposition) == ERROR_SUCCESS)
{
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
RegSetValueEx(currKey, TEXT("DisableTaskMgr"), 0, dwType, (PBYTE)&value, dwSize);
RegCloseKey(currKey);
}
}

但是,将.exe移动到同一台计算机上的来宾用户后,它不会禁用任务管理器。所以我去研究它是如何工作的以及为什么,从微软的MSDN这里,我发现HKEY_CURRENT_USER不会改变,需要使用RegOpenCurrentUser将当前密钥设置为运行该程序的用户。我知道这篇文章,但答案不是决定性的。

因此,话虽如此,我希望知道解决这个问题的正确方法。这里的目标是使运行此代码.exe的任何人都无法运行任务管理器。

仅供参考,只是为了让阅读本文的人知道,我打算在触发标志时将其用作防御机制,我想阻止恶意实体通过任务管理器杀死此过程。

什么是HKEY_CURRENT_USER? 这真的很REGISTRYUSER<UserSid><UserSid>一些 sid。 处理首次使用HKEY_CURRENT_USER时 (当前用户密钥的根尚未打开) 系统查询当前用户 SID (TokenUser),将 sid 转换为字符串,附加REGISTRYUSER前缀,打开和缓存打开的密钥。下次处理时使用,HKEY_CURRENT_USER- 使用已打开和缓存的密钥。即使线程正在模拟 - 这不会改变任何内容。但是,有时我们需要在模拟后访问不同的用户密钥。正是针对这种情况,RegOpenCurrentUser和使用。此 API 查询当前线程(或进程)令牌以获取TokenUser,根据当前用户 SID 设置路径格式,打开REGISTRYUSER<UserSid1>并返回句柄。它不会缓存此句柄,而是在不再需要返回的句柄时关闭它。

因此,如果您不模拟当前线程,则一开始毫无意义的使用RegOpenCurrentUser

其次,这段代码总是毫无意义:

LRESULT lResult = RegOpenCurrentUser(KEY_READ, &hkey);
if (RegCreateKeyEx(HKEY_CURRENT_USER,..

无论如何,您都无法使用返回的hKey。 在这种情况下打开它有什么意义?

需要HKEY_CURRENT_USER到位使用它!

LRESULT lResult = RegOpenCurrentUser(KEY_READ, &hkey);
if (RegCreateKeyEx(hKey,..

为什么代码在来宾下不起作用? 当您调用RegCreateKeyEx并生成密钥(在您的情况下system)但不存在时 - 您需要具有对父密钥(Policies密钥)的KEY_CREATE_SUB_KEY访问权限。 但是,默认情况下,来宾对密钥没有任何写入访问权限。 您根本无法KEY_CREATE_SUB_KEY访问权限。KEY_SET_VALUE你也没有。 确保在来宾呼叫下RegCreateKeyEx返回ERROR_ACCESS_DENIED给您。