【问题标题】:Proper use of RegOpenCurrentUser正确使用 RegOpenCurrentUser
【发布时间】:2018-06-30 18:15:03
【问题描述】:

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

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

#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 here 中研究了它是如何以及为什么工作的,我发现 HKEY_CURRENT_USER 不会更改,并且需要使用 RegOpenCurrentUser 将当前密钥设置为运行该程序的用户。我知道this 的帖子,但答案不是决定性的。

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

仅供参考,只要读到这篇文章的人都知道,我打算在触发标志的情况下将其用作防御机制,我想阻止恶意实体通过任务管理器杀死该进程。

【问题讨论】:

  • 您是否使用 regedit 检查过该值是否已设置?
  • 如果您不使用模拟 - 通话毫无意义 RegOpenCurrentUser
  • 你明白你在做什么吗?什么毫无意义的电话RegOpenCurrentUser?我指出你的错误
  • 不管怎样,你必须在待命的客人RegCreateKeyEx987654328@下遇到错误访问被拒绝
  • documentation 还说:HKEY_CURRENT_USER 键映射到HKEY_USERS 键中的当前用户分支的根。” i> 除非您明确加载其他用户的个人资料(您的问题并未声称您是),否则您的问题是不同的,RegOpenCurrentUser 不是解决方案。不要问你的解决方案。而是询问您的问题。首先实施适当的错误报告。

标签: c++ winapi registry taskmanager


【解决方案1】:

HKEY_CURRENT_USER 是什么?这真的是\REGISTRY\USER\&lt;UserSid&gt; &lt;UserSid&gt; 一些 sid。当进程第一次使用HKEY_CURRENT_USER(当前用户密钥的root尚未打开)系统查询当前用户sid(TokenUser),将sid转换为字符串,附加\REGISTRY\USER\前缀,打开和 cache 打开密钥。当进程下一次使用时,HKEY_CURRENT_USER - 使用已经打开和缓存的密钥。即使线程正在模拟 - 这不会改变任何事情。但是有时我们需要在模拟后访问不同的用户密钥。正是针对这种情况和RegOpenCurrentUser 并使用。这个api查询TokenUser的当前线程(或进程)令牌,根据当前用户sid格式化路径,打开\REGISTRY\USER\&lt;UserSid1&gt;并返回句柄给你。当您不再需要返回的句柄时,它不会缓存此句柄,而是必须关闭它。

所以如果你不模拟当前线程,一开始就毫无意义地使用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,..

为什么代码在 guest 下不起作用?当您调用RegCreateKeyEx 并且结果密钥(在您的情况下为system)但不存在时 - 您需要拥有KEY_CREATE_SUB_KEY 访问父级(Policies 密钥)的权限。但是默认情况下,客人对密钥没有任何写入权限。您根本没有KEY_CREATE_SUB_KEY 访问权限。而KEY_SET_VALUE 你也没有。确保在客人电话RegCreateKeyEx 下将ERROR_ACCESS_DENIED 回复给您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2012-11-08
    • 2015-06-09
    相关资源
    最近更新 更多