前言
肯定很多学习C++的人都想过如何用C++制作一个像MEMZ弹出一大堆弹窗的特效病毒程序,今天我就来教大家如何实现。
用到的函数
核心:C++ Windows API(<windows.h>)中的CreateThread()函数。此函数可实现多线程,同时执行很多任务。
核心2:C++ Windows API(<windows.h>)中的MessageBox()函数。此函数可以弹出消息框。
搭配使用这两个函数,即可达到同时弹出弹窗的效果。
一、随机数
由于需要将弹窗弹在随机位置,我们需要用到随机数来确定。以下是MEMZ病毒中生成随机数的源代码:
#include <windows.h>
HCRYPTPROV prov;
int random()
{
if (prov == NULL)
{
if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_SILENT |
CRYPT_VERIFYCONTEXT))
{
ExitProcess(1);
}
}
int out;
CryptGenRandom(prov, sizeof(out), (BYTE*)(&out));
return out & 0x7fffffff;
}
原理比较生僻,这里就不给大家解释了。
此函数用法:与rand()函数相同。
二、弹出弹窗函数
这里定义了三个函数用于弹弹窗。
void mess1(LPVOID lp)
{
MessageBoxA(NULL, "Windows遇到毁灭性错误!", "Windows错误报告", MB_OK | MB_SYSTEMMODAL | MB_ICONSTOP);
}
void mess2(LPVOID lp)
{
MessageBoxA(NULL, "Windows遇到毁灭性错误!", "Windows错误报告", MB_OK | MB_SYSTEMMODAL | MB_ICONSTOP);
}
void mess3(LPVOID lp)
{
MessageBoxA(NULL, "Windows遇到毁灭性错误!", "Windows错误报告", MB_OK | MB_SYSTEMMODAL | MB_ICONSTOP);
}
“Windows遇到毁灭性错误!”是弹窗内容,“Windows错误报告”是弹窗标题。
三、重复弹出弹窗
void MainProgram()
{
//弹出弹窗的个数
int NumberOfMessageBox = 20;
//HWND数组记录每个弹窗的句柄
HWND hwnd[10005];
NumberOfMessageBox += 3;
Sleep(4000);
for (int i = 1; i <= NumberOfMessageBox / 3; i++)
{
//创建弹窗
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mess1, 0, 0, 0);
Sleep(90);
//搜索弹窗位置
hwnd[i] = FindWindowA(NULL, "Windows错误报告");
//隐藏弹窗并移动到屏幕随机位置,待会一起显示
ShowWindow(hwnd[i], SW_HIDE);
MoveWindow(hwnd[i], random() % 1920, random() % 1080, 220, 180, false);
//创建弹窗1
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mess2, 0, 0, 0);
Sleep(90);
//搜索弹窗位置1
hwnd[i + 3334] = FindWindowA(NULL, "Windows错误报告");
//隐藏弹窗并移动到屏幕随机位置,待会一起显示1
ShowWindow(hwnd[i + 3334], SW_HIDE);
MoveWindow(hwnd[i + 3334], random() % 1920, random() % 1080, 220, 180, false);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mess3, 0, 0, 0);
Sleep(90);
//搜索弹窗位置2
hwnd[i + 6667] = FindWindowA(NULL, "Windows错误报告");
//隐藏弹窗并移动到屏幕随机位置,待会一起显示2
ShowWindow(hwnd[i + 6667], SW_HIDE);
MoveWindow(hwnd[i + 6667], random() % 1920, random() % 1080, 220, 180, false);
}
注释上面有解释。
ShowWindow()显示/隐藏弹窗
MoveWindow()移动弹窗
CreateThread()创建弹窗线程
三、一齐显示弹窗,然后关闭弹窗
Sleep(1000);
for (int i = 1; i <= NumberOfMessageBox; i++)
{
ShowWindow(hwnd[i], SW_SHOW);
Sleep(15);
ShowWindow(hwnd[i + 3334], SW_SHOW);
Sleep(15);
ShowWindow(hwnd[i + 6667], SW_SHOW);
}
Sleep(1000);
for (int i = 1; i <= NumberOfMessageBox / 3; i++)
{
SendMessage(hwnd[i], WM_CLOSE, 0, 0);
Sleep(5);
SendMessage(hwnd[i + 3334], WM_CLOSE, 0, 0);
Sleep(5);
SendMessage(hwnd[i + 6667], WM_CLOSE, 0, 0);
Sleep(5);
}
return;
}
ShowWindow()显示弹窗
SendMessage()发送WM_CLOSE消息关闭弹窗
就是那么简单。
完整版:
#include <windows.h>
HCRYPTPROV prov;
int random()
{
if (prov == NULL)
{
if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_SILENT | CRYPT_VERIFYCONTEXT))
{
ExitProcess(1);
}
}
int out;
CryptGenRandom(prov, sizeof(out), (BYTE*)(&out));
return out & 0x7fffffff;
}
void mess1(LPVOID lp)
{
MessageBoxA(NULL, "Windows遇到毁灭性错误!", "Windows错误报告", MB_OK | MB_SYSTEMMODAL | MB_ICONSTOP);
}
void mess2(LPVOID lp)
{
MessageBoxA(NULL, "Windows遇到毁灭性错误!", "Windows错误报告", MB_OK | MB_SYSTEMMODAL | MB_ICONSTOP);
}
void mess3(LPVOID lp)
{
MessageBoxA(NULL, "Windows遇到毁灭性错误!", "Windows错误报告", MB_OK | MB_SYSTEMMODAL | MB_ICONSTOP);
}
//主函数
void MainProgram()
{
int NumberOfMessageBox = 20;
HWND hwnd[10005];
HWND ThisProgram = GetForegroundWindow();
NumberOfMessageBox += 3;
ShowWindow(ThisProgram, SW_HIDE);
Sleep(4000);
for (int i = 1; i <= NumberOfMessageBox / 3; i++)
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mess1, 0, 0, 0);
Sleep(90);
hwnd[i] = FindWindowA(NULL, "Windows错误报告");
ShowWindow(hwnd[i], SW_HIDE);
MoveWindow(hwnd[i], random() % 1920, random() % 1080, 220, 180, false);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mess2, 0, 0, 0);
Sleep(90);
hwnd[i + 3334] = FindWindowA(NULL, "Windows错误报告");
ShowWindow(hwnd[i + 3334], SW_HIDE);
MoveWindow(hwnd[i + 3334], random() % 1920, random() % 1080, 220, 180, false);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)mess3, 0, 0, 0);
Sleep(90);
hwnd[i + 6667] = FindWindowA(NULL, "Windows错误报告");
ShowWindow(hwnd[i + 6667], SW_HIDE);
MoveWindow(hwnd[i + 6667], random() % 1920, random() % 1080, 220, 180, false);
}
Sleep(1000);
for (int i = 1; i <= NumberOfMessageBox; i++)
{
ShowWindow(hwnd[i], SW_SHOW);
Sleep(15);
ShowWindow(hwnd[i + 3334], SW_SHOW);
Sleep(15);
ShowWindow(hwnd[i + 6667], SW_SHOW);
}
Sleep(1000);
for (int i = 1; i <= NumberOfMessageBox / 3; i++)
{
SendMessage(hwnd[i], WM_CLOSE, 0, 0);
Sleep(5);
SendMessage(hwnd[i + 3334], WM_CLOSE, 0, 0);
Sleep(5);
SendMessage(hwnd[i + 6667], WM_CLOSE, 0, 0);
Sleep(5);
}
return;
}
int Main()
{
MainProgram();
return 0x0;
}