C++如何使用多线程弹出很多弹窗以及更多应用

前言

肯定很多学习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;
}

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值