从注册表读取截取值
Intercept value read from registry
我正在加载一个第三方DLL,它从HKCU读取一些自己的设置,我想通过改变它读取的几个值来改变它的行为。
假设它只在第一次加载时读取,我可以将更改的值写入注册表,然后加载DLL,然后再次更改值。但是在很短的一段时间内,这也会影响其他可能加载相同DLL的进程。
是否有一种方法可以改变它将在我自己的进程中读取的值?
是否有一种方法可以改变它将在我自己的进程中读取的值?
使用Win32 API函数,DLL调用该函数从注册表中读取。有许多绕行库可以帮助实现这一点。
你可以使用firefox的windowwsdllinteceptor,它是api钩子的头文件拦截器。
修改vml标签值的示例代码:
typedef DWORD(__stdcall *NtQueryKeyType)(
HANDLE KeyHandle,
int KeyInformationClass,
PVOID KeyInformation,
ULONG Length,
PULONG ResultLength);
NtQueryKeyType sNtQueryKeyPtr = NULL;
std::wstring GetKeyPathFromKKEY(HKEY key)
{
std::wstring keyPath;
if (sNtQueryKeyPtr != NULL) {
DWORD size = 0;
DWORD result = 0;
result = sNtQueryKeyPtr(key, 3, 0, 0, &size);
if (result == STATUS_BUFFER_TOO_SMALL) {
size = size + 2;
wchar_t* buffer = new (std::nothrow) wchar_t[size / sizeof(wchar_t)]; // size is in bytes
if (buffer != NULL)
{
result = sNtQueryKeyPtr(key, 3, buffer, size, &size);
if (result == STATUS_SUCCESS)
{
buffer[size / sizeof(wchar_t)] = L' ';
keyPath = std::wstring(buffer + 2);
}
delete[] buffer;
}
}
}
return keyPath;
}
DWORD __stdcall VWMLNtQueryKey(
HANDLE KeyHandle,
int KeyInformationClass,
PVOID KeyInformation,
ULONG Length,
PULONG ResultLength) {
auto str = GetKeyPathFromKKEY((HKEY)KeyHandle);
if (!str.empty() && base::StringProcess::endsWith(str, L"Internet Explorer\Version Vector"))
return STATUS_INVALID_PARAMETER;
return sNtQueryKeyPtr(KeyHandle, KeyInformationClass, KeyInformation, Length, ResultLength);
}
base::WindowsDllInterceptor ntHook;
ntHook.Init("ntdll.dll");
if (!ntHook.AddHook("NtQueryKey", reinterpret_cast<intptr_t>(&VWMLNtQueryKey),
(void**)&sNtQueryKeyPtr)) {
removeVMLTags(&html);
}
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 从注册表读取截取值