正确使用RegOpenCurrentUser

时间:2018-01-22 06:55:41

标签: c++ winapi registry taskmanager

我去了here并制作了一个测试程序,看看它是否真的禁用了任务管理器。基本上一个简单的bool开关然后关闭以查看任务管理器是否实际被禁用。当我编译并运行它时,它按预期工作。

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

#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移动到同一台计算机上的guest用户之后,它不会禁用任务管理器。所以我从微软的MSDN here开始研究它是如何工作的原因,我发现HKEY_CURRENT_USER没有改变,需要使用RegOpenCurrentUser来设置运行该程序的用户的当前密钥。我知道this帖子,但答案并不确定。

所以说到这一点,我想知道解决这个问题的正确方法。这里的目标是让运行此代码的.exe的任何人都无法运行任务管理器。

仅供参考,所以无论谁读到这个都知道,我打算在触发标志的情况下使用它作为防御机制,我想阻止恶意实体通过任务管理器终止这个过程。

1 个答案:

答案 0 :(得分:2)

什么是HKEY_CURRENT_USER?这真的是\REGISTRY\USER\<UserSid>,其中<UserSid>是一些sid。当进程第一次使用HKEY_CURRENT_USER(当前用户密钥的根目录尚未打开)时,系统查询当前用户sid(TokenUser),将sid转换为字符串,追加{{ 1}}前缀,打开和缓存打开的密钥。当进程下次使用时,\REGISTRY\USER\ - 使用已经打开和缓存的密钥。即使线程是模仿 - 这没有任何改变。但有时我们需要在模仿后访问不同的用户密钥。完全适合这种情况和RegOpenCurrentUser并使用。此api查询TokenUser的当前线程(或进程)令牌,格式路径基于当前用户sid,打开HKEY_CURRENT_USER并返回句柄。它不会缓存此句柄,而是在您不再需要返回的句柄时必须关闭它。

所以如果你没有模仿当前的线程,首先要毫无意义地使用\REGISTRY\USER\<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访问父(KEY_CREATE_SUB_KEY密钥)。但是默认情况下,guest对键没有任何写访问权限。你根本没有Policies访问权限。和KEY_CREATE_SUB_KEY你也没有。确保在来宾KEY_SET_VALUE下给您回复RegCreateKeyEx