钩子问题 有谁能给小第详细的介绍一下钩子的原理 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转贴子首先声明一下,标题所指的钩子是消息钩子,而不是API钩子(一种对API地址的替换技术)。若标题使您误解,请不要继续阅读。 消息钩子在Windows编程中有着非常广泛的应用,它可以任意拦截Windows系统,这个以消息为驱动的系统中的绝大多数消息类型。一方面这给编程者带来了巨大的灵活性,另一方面也埋下了巨大隐患,大多数窃密软件都使用这种方法。此篇文章给您提供一种钩子的反拦截方法,希望对您有所帮助。文章中使用了API钩子,您之前必须对此技术有一定了解。 为求完整,文章分为两部分,第一部分为消息钩子的使用,熟悉此技术的读者可以直接跳过此节。第二部分为消息钩子的反拦截。 一、消息钩子的使用。 消息钩子分为本地(local)和远程(remote)两种(两个local system-wide hook例外,无关主题,不多说了)。local类型的钩子函数只能拦截本进程的消息。能够拦截本进程以外的消息的钩子,都是remote类型。remote类型的钩子必须放在DLL里面。下面以remote类型为例,通过安装键盘钩子介绍其使用。 1、首先建立DLL,在头文件中添加如下代码。#ifdef KM_EXPORTS#define KM_API __declspec(dllexport)#else#define KM_API __declspec(dllimport)#endifKM_API BOOL HookStart();//安装钩子KM_API BOOL HookStop();//卸载钩子 2、在.cpp文件中添加代码#pragma data_seg("Shared")HHOOK g_hhookKey=NULL;#pragma data_seg()#pragma comment(linker,"/SECTION:Shared,RWS") g_hhookKey为键盘钩子的句柄,为确保此数值在所有实例中均保持不变,将其存放于此模块所有实例的共享数据区,若在exe程序中按此格式添加一int 变量 appNum,在程序启动时appNum++,则可以通过访问此变量的数值,确定有多少个exe的实例,当然这种方法也可以替代同步对象用于只启动一个实例。HINSTANCE g_hinstDll=NULL; //添加全局变量用于记录此DLL模块的句柄BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hinstDll=(HINSTANCE)hModule;//在DLL加载时对全局变量赋值 .................. }} LRESULT KeyHookProc(int nCode,WPARAM wParam,LPARAM lParam)//键盘钩子的过滤函数{ ..................... return::CallNextHookEx(g_hhookKey,nCode,wParam,lParam);//*****请留意此行代码*****}BOOL HookStart()//安装钩子{ g_hhookKey=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHookProc,g_hinstDll, ::GetWindowThreadProcessId(::FindWindow(NULL,"被监视的窗口的标题"),NULL) ); return (g_hhookKey!=NULL);}BOOL HookStop()//卸载钩子{ BOOL ret; if(g_hhookKey!=NULL) ret=::UnhookWindowsHookEx(g_hhookKey); g_hhookKey=NULL; return ret;} 关于枚举BCG菜单的问题 求帮助,如何设计一个按钮,从选择的txt文件中提取数据,并导入到数据库中 history6.dat的文件格式 在IE工具条上添加一个类似滚动新闻那样的滚动条的控件 图像的球面化和凹面化算法? vc6.0中控制台程序 调用dll问题? 初学者问题,望高手指点!UP有分! 求助:BasicExcelVC6使用问题 CString中0x07这种形式怎么表示? 还是送分,快来抢啊. 关于 Raw Socket: 原始套接字 到底能不能 "截获" 数据包 呀 ? 关于打印的动态连接库的问题
首先声明一下,标题所指的钩子是消息钩子,而不是API钩子(一种对API地址的替换技术)。若标题使您误解,请不要继续阅读。
消息钩子在Windows编程中有着非常广泛的应用,它可以任意拦截Windows系统,这个以消息为驱动的系统中的绝大多数消息类型。一方面这给编程者带来了巨大的灵活性,另一方面也埋下了巨大隐患,大多数窃密软件都使用这种方法。此篇文章给您提供一种钩子的反拦截方法,希望对您有所帮助。文章中使用了API钩子,您之前必须对此技术有一定了解。
为求完整,文章分为两部分,第一部分为消息钩子的使用,熟悉此技术的读者可以直接跳过此节。第二部分为消息钩子的反拦截。
消息钩子分为本地(local)和远程(remote)两种(两个local system-wide hook例外,无关主题,不多说了)。local类型的钩子函数只能拦截本进程的消息。能够拦截本进程以外的消息的钩子,都是remote类型。remote类型的钩子必须放在DLL里面。下面以remote类型为例,通过安装键盘钩子介绍其使用。
1、首先建立DLL,在头文件中添加如下代码。#ifdef KM_EXPORTS
#define KM_API __declspec(dllexport)
#else
#define KM_API __declspec(dllimport)
#endifKM_API BOOL HookStart();//安装钩子
KM_API BOOL HookStop();//卸载钩子 2、在.cpp文件中添加代码#pragma data_seg("Shared")
HHOOK g_hhookKey=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:Shared,RWS") g_hhookKey为键盘钩子的句柄,为确保此数值在所有实例中均保持不变,将其存放于此模块所有实例的共享数据区,若在exe程序中按此格式添加一int 变量 appNum,在程序启动时appNum++,则可以通过访问此变量的数值,确定有多少个exe的实例,当然这种方法也可以替代同步对象用于只启动一个实例。HINSTANCE g_hinstDll=NULL; //添加全局变量用于记录此DLL模块的句柄
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hinstDll=(HINSTANCE)hModule;//在DLL加载时对全局变量赋值
..................
}
}
{
.....................
return::CallNextHookEx(g_hhookKey,nCode,wParam,lParam);//*****请留意此行代码*****
}BOOL HookStart()//安装钩子
{
g_hhookKey=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHookProc,g_hinstDll,
::GetWindowThreadProcessId(::FindWindow(NULL,"被监视的窗口的标题"),NULL) );
return (g_hhookKey!=NULL);
}BOOL HookStop()//卸载钩子
{
BOOL ret;
if(g_hhookKey!=NULL)
ret=::UnhookWindowsHookEx(g_hhookKey);
g_hhookKey=NULL;
return ret;
}