【发布时间】:2021-03-05 10:40:44
【问题描述】:
我正在尝试在 Windows 上进行 C++ 编程以进行逆向工程,但我一直在尝试拥有 Windows 注册表项。 RegCreateKey 和 RegSetValueEx 函数返回 ERROR_SUCCESS,但检查注册表时缺少键。
代码如下:
void AddRunKey() {
wchar_t subkey[512];
wchar_t cmd[512];
wcscpy_s(subkey, L"Test");
wcscpy_s(cmd, L"%windir%\system32\cmd.exe");
HKEY runKey;
long res;
res = RegCreateKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurentVersion\\Run", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &runKey, NULL);
if (res != ERROR_SUCCESS) {
std::cout << "fail\n";
}
res = RegSetValueEx(runKey, subkey, 0, REG_EXPAND_SZ, (BYTE*)cmd, wcslen(cmd) + 1);
if (res != ERROR_SUCCESS) {
std::cout << "fail\n";
}
RegCloseKey(runKey);
}
int _tmain() {
AddRunKey();
}
我在 Windows 10 - 64 位虚拟机上的 Visual Studio、发布模式、64 位上编译它。运行代码时不返回错误。
打开 Windows 注册表编辑器时,在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 下找不到键
是什么导致了这种行为?我该如何解决?
EDIT(更新密钥路径):RegCloseKey 返回 0
【问题讨论】:
-
reg 关闭键的返回值是?
-
RegCloseKey的返回值为0 完整路径为“Ordinateur\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”
-
在发布的代码中,您不会刷新您写入
std::cout的内容。您可能需要添加std::flush或std::endl。但是,如果您的程序确实在您调用AddRunKey后立即退出(您发布的代码表明),则不需要刷新。 -
一个明显的错误是
RegSetValueEx的最后一个参数是字节,所以应该是(wcslen(cmd) + 1) * sizeof(wchar_t) -
您在
Run键下创建一个值,而不是一个键(即使您将其误称为subkey)。