gpt4 book ai didi

c++ - 检查注册表项是否链接到另一个注册表项(或拷贝)

转载 作者:行者123 更新时间:2023-11-27 23:42:59 25 4
gpt4 key购买 nike

如何使用 winapi 检查注册表项是否链接到另一个注册表项?

例如,我需要找出哪个分支是原始的 HKEY_LOCAL_MACHINE\SECURITY\SAMHKEY_LOCAL_MACHINE\SAM\SAMHKEY_CURRENT_USERHKEY_USERS\S-1-5-21

我对键和值的类型感到困惑。键有类型吗?我可以为此目的使用 REG_LINK 类型吗?

最佳答案

首先我们必须打开 key 本身,而不是潜在符号链接(symbolic link) key 所指的 key (这是默认行为)。

为此我们需要使用 REG_OPTION_OPEN_LINK通话中的选项 RegOpenKeyExW ZwOpenKeyEx .另一种方法是使用 OBJ_OPENLINK OBJECT_ATTRIBUTES 中的属性.并在通话中使用它 ZwOpenKey[Ex]

key 打开后我们可以查询(win7以上)无证 KeyFlagsInformation 信息来自ZwQueryKey .如果标志显示这是符号链接(symbolic link) - 我们可以查询 SymbolicLinkValue值以获取链接目标键。请注意,即使此值存在类型 REG_LINK - 这并不能证明这是符号链接(symbolic link)。

struct KEY_CONTROL_FLAGS_INFO_W7  // KeyFlagsInformation for Win7
{
ULONG ControlFlags[3];
};

#define KEY_CTRL_FL_W7_01__IS_VOLATILE 0x01
#define KEY_CTRL_FL_W7_01__SYM_LINK 0x02

LSTATUS IsSymLink(HKEY hKey, PCWSTR lpSubKey, BOOL& IsLink)
{
LSTATUS r = RegOpenKeyEx(hKey, lpSubKey, REG_OPTION_OPEN_LINK, KEY_READ|KEY_WOW64_64KEY, &hKey);

if (r == NOERROR)
{
ULONG Type, cb = 0, rcb = 0x80;

KEY_CONTROL_FLAGS_INFO_W7 kcf;

NTSTATUS status;

if (0 <= (status = ZwQueryKey(hKey, KeyFlagsInformation, &kcf, sizeof(kcf), &cb)))
{
if (kcf.ControlFlags[1] & KEY_CTRL_FL_W7_01__SYM_LINK)
{
IsLink = TRUE;
DbgPrint("key is link\n");

PVOID stack = alloca(guz), buf = 0;

do
{
if (cb < rcb)
{
cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
}

r = RegQueryValueExW(hKey, L"SymbolicLinkValue", 0, &Type, (PBYTE)buf, &(rcb = cb));

if (r == NOERROR && Type == REG_LINK && !(rcb & (sizeof(WCHAR) - 1)))
{
DbgPrint("%.*S\n", rcb / sizeof(WCHAR), buf);
}

} while (r == ERROR_MORE_DATA);
}
}
else
{
r = RtlNtStatusToDosError(status);
}

RegCloseKey(hKey);
}

return r;
}

Does key have type?

没有。类型只有键的值

Can I use REG_LINK type for this purpose?

我们可以在常规(而非链接)键上创建 SymbolicLinkValue类型为 REG_LINK 的值,但此后 key 不会成为链接。 key 最初必须使用 REG_OPTION_CREATE_LINK 创建选项。所以通过查询 SymbolicLinkValue value 我们无法可靠地检查这是否是一个链接,但如果我们知道这是一个链接 - 我们可以通过查询 SymbolicLinkValue 来获取链接的目标。

关于c++ - 检查注册表项是否链接到另一个注册表项(或拷贝),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53009194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com