首页
社区
课程
招聘
[原创]Win键屏蔽
2006-12-29 13:57 9259

[原创]Win键屏蔽

2006-12-29 13:57
9259
这个在Unpack已经发过了.
为了更多的人看到,也发看雪吧.
还是那句话,麻雀虽小,但涉及的东西也不少了.
HOOK的应用.
分为VC和ASM两个版本.ASM写米写HOOK部分,原因是我导出时函数名米让编译器改变.
都在这一个包里了.

2006/12/27重写,同时移植了asm版
感谢我的好友Jampe
贴VC一部分代码.主要都在附件了.
/*--------------------------------------------------------------------*
*                                Win键屏蔽                            *
*                               qxtianlong                            *
*                            只是我研究学习之用                       *
*                                 无聊之作                            *
*                                2006/12/27                           *
*           如果有任何问题可以给我Email:qxtianlong.x@gmail.com        *
*                        感谢所有帮助过我的朋友                       *
*                              第二人生俱乐部                         *
*---------------------------------------------------------------------*/

#include <Windows.h>
#include "hook.h"


#define _WIN32_WINNT 0x0400         //使用PKBDLLHOOKSTRUCT结构必须包含

HINSTANCE g_hInstance;

HHOOK g_hKeyboard;

//消息处理
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	PKBDLLHOOKSTRUCT pKey;

	switch(nCode)
	{
		case HC_ACTION:
			{
				pKey = (PKBDLLHOOKSTRUCT)lParam;//初始化对象

				switch(wParam)
				{
				case WM_KEYDOWN:
				case WM_SYSKEYDOWN:
				case WM_KEYUP:
				case WM_SYSKEYUP:
					{
						 if((pKey->vkCode == VK_LWIN) || (pKey->vkCode == VK_RWIN))//屏蔽win键
						 {
							 return TRUE;
						 }
					}
					break;
			
				default:
					{
						//什么都不干
					}
					break;
				}
		
			}//HC_ACTION
	
		default:
			{
				//什么都不干
			}
			break;
	}

	return CallNextHookEx(g_hKeyboard,nCode,wParam,lParam);//传给系统继续处理
}

//初始化钩子
void __declspec(dllexport)  InitHOOK()
{
	g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hInstance, 0);//安装钩子
}

//卸载钩子
void __declspec(dllexport)  StopHOOK()
{
    UnhookWindowsHookEx(g_hKeyboard);//卸载钩子
}

//主函数
BOOL WINAPI DllMain(HINSTANCE hinstDLL,
                    DWORD fdwReason,
                    LPVOID lpvReserved)
{
	g_hInstance = hinstDLL;//保存实例

	switch(fdwReason)
	{
	case DLL_PROCESS_ATTACH:
		{

		}
		break;
	case DLL_THREAD_ATTACH:
		{

		}
		break;
	case DLL_THREAD_DETACH:
		{

		}
		break;
	case DLL_PROCESS_DETACH:
		{

		}
		break;
	}

	return TRUE;
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (12)
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-12-29 14:44
2
0
不错。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chinawash 2006-12-29 15:32
3
0
收藏一份,顺便问LZ知道如何屏蔽系统的Ctrl+Alt+Del组合按键吗
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-12-29 21:20
4
0

#define _WIN32_WINNT 0x0400 //使用PKBDLLHOOKSTRUCT结构必须包含

这句应该放在"#include <windows.h>"的前面.
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-12-29 21:40
5
0
很奇怪的是,程序必须创建窗口,hook才起作用.
没有窗口或控制台的情况键盘屏蔽无效,而且还使键盘反应迟钝.
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-12-29 21:48
6
0
精简版
#pragma comment(linker,"/SUBSYSTEM:windows /ENTRY:main")
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <stdio.h>
HHOOK g_hh;
LRESULT CALLBACK KeybordProc(int code,WPARAM wp,LPARAM lp)
{
	if(code==HC_ACTION&&wp==WM_KEYDOWN)
	{
		PKBDLLHOOKSTRUCT pKey=(PKBDLLHOOKSTRUCT)lp;
		if(pKey->vkCode==VK_LWIN||pKey->vkCode==VK_RWIN)
			return TRUE;
	}
	return CallNextHookEx(g_hh,code,wp,lp);
}
void main()
{
	HHOOK g_hh=SetWindowsHookEx(WH_KEYBOARD_LL,KeybordProc,(HINSTANCE)0x400000,0);
	if(!g_hh) return;
	MessageBox(0,"Now hooking your win keys...","HOOK",0);
	UnhookWindowsHookEx(g_hh);
}
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lingyu 1 2006-12-30 04:04
7
0
玩魔兽时Win键老碍事,正打算把Win键挖了呢。
这下省了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sajing 2006-12-30 09:31
8
0
不错  收藏一份
雪    币: 253
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
qxtianlong 1 2006-12-30 11:40
9
0
最初由 dwing 发布
很奇怪的是,程序必须创建窗口,hook才起作用.
没有窗口或控制台的情况键盘屏蔽无效,而且还使键盘反应迟钝.

最初由 dwing 发布
精简版
[CODE]
#pragma comment(linker,"/SUBSYSTEM:windows /ENTRY:main")
#define _WIN32_WINNT 0x0400
#include <windows.h>
........

#define _WIN32_WINNT 0x0400
#include <windows.h>
已经改了.
在我这没有任何问题,
你的精简版虽然不错,但是多少有点问题,呵呵,具体什么问题.自己看吧.
keyboardproc and lowlevelkeyboardproc 是不同的...
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 3 2006-12-30 11:48
10
0
最初由 qxtianlong 发布
#define _WIN32_WINNT 0x0400
#include <windows.h>
已经改了.
在我这没有任何问题,
你的精简版虽然不错,但是多少有点问题,呵呵,具体什么问题.自己看吧.
........


你说错了,他用的就是低级钩子,跟函数名称没有关系,当然不做成DLL的话就只能阻挡自身的输入

另外如果有DI游戏用到WIN键(当然这只是个假设 ),那么钩子是无效的
如果DI的独占模式被开启,那么任何BLOCK都会失效

抛去权限不谈,最好的解决方法当然是写过滤驱动
雪    币: 253
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
qxtianlong 1 2006-12-30 12:04
11
0
DI的话也容易,对于游戏工作者还难得到么.哇哈哈
不过我认为对消息的获得方式是不懂的.
虽然是用的WH_KEYBOARD_LL
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
edisonH 3 2006-12-31 17:54
12
0
最初由 dwing 发布
很奇怪的是,程序必须创建窗口,hook才起作用.


This hook is called in the context of the thread that installed it. The call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.

最初由 dwing 发布

没有窗口或控制台的情况键盘屏蔽无效,而且还使键盘反应迟钝.


The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key:
HKEY_CURRENT_USER\Control Panel\Desktop

The value is in milliseconds. If the hook procedure does not return during this interval, the system will pass the message to the next hook.
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-12-31 20:23
13
0
最初由 edisonH 发布
This hook is called in the context of the thread that installed it. The call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.

The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key:
........

Thanx!
游客
登录 | 注册 方可回帖
返回