我去了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的任何人都无法运行任务管理器。
仅供参考,所以无论谁读到这个都知道,我打算在触发标志的情况下使用它作为防御机制,我想阻止恶意实体通过任务管理器终止这个过程。
答案 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
。