登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 相关下载 - 操作系统 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

勾子编程指南
发表日期:2005-12-10 文件大小:103KB 下载次数:9481  

版权所有:
软件版本:文本+代码
文件大小:103KB
操作系统:win9x/NT/2000/XP
下载说明: 关于钩子HOOK函数的详细说明

钩子HOOK函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。当然,这么做也是需要付出一定的代价的。由于多了这么一道处理过程,系统性能会受到一定的影响,所以大家在必要的时候才使用“钩子”,并在使用完毕及时将其删除。
  首先让我们看看HOOK函数是怎么安装、调用和删除的。应用程序通常是调用SetWindowsHookEx()函数来进行安装的,其函数的原型如下:

SetWindowsHookEx(

Int idHook;

HOOKPROC lpfn;

HINSTANCE hMod;

DWORD dwThreadId;

);

参数说明:

idHook 是”钩子”的类型,”钩子”的类型一共有13种,具体如下表:

“钩子”类型
解释

WH_CALLWNDPROC
系统将消息发送到指定窗口之前的“钩子”

WH_CALLWNDPROCRET
消息已经在窗口中处理的“钩子”

WH_CBT
基于计算机培训的“钩子”

WH_DEBUG
差错“钩子”

WH_FOREGROUNDIDLE
前台空闲窗口“钩子”

WH_GETMESSAGE
接收消息投递的“钩子”

WH_JOURNALPLAYBACK
回放以前通过WH_JOURNALRECORD“钩子”记录的输入消息

WH_JOURNALRECORD
输入消息记录“钩子”

WH_KEYBOARD
键盘消息“钩子”

WH_MOUSE
鼠标消息“钩子”

WH_MSGFILTER
对话框、消息框、菜单或滚动条输入消息“钩子”

WH_SHELL
外壳“钩子”

WH_SYSMSGFILTER
系统消息“钩子”


lpfn 指向“钩子”过程的指针。

hMod “钩子”过程所在模块的句柄。

dwThreadId “钩子”相关线程的标识。

  通常我们都是把”钩子”做成动态链接库,这样的好处是可以是系统内的每个进程访问。但是也可以在系统中直接调用,我的建议还是用动态库。如果用动态库的话,那么SetWindowsHookEx()中的第三个参数就是该动态链接库模块的句柄;对于一个只供单个进程访问的”钩子”,可以将其”钩子”过程放在安装”钩子”的同一个线程内,此时SetWindowsHookEx()中的第三个参数为该线程的hInstance。安装”钩子”有两种方法:1.你可以把他做成动态连接库文件,和程序一起编译。2.你可以在程序的任何地方直接调用。第2种的方法太麻烦,我不建议用,在这里我就不详细介绍啦。相比之下第1种比较简单。其”钩子”的过程都在动态链接库内完成。SetWindowsHookEx()函数是一个安装函数,如故一个由某种类型的”钩子”监视的事件发生,系统就会调用相应类型的”钩子”链开始处的”钩子”过程,”钩子”链的每个”钩子”过程都要考虑是否把事件传递给下一个”钩子”过程。如果要传递的话,就要调用CallNestHookEx()函数。这个函数成功时返回”钩子”链中下一个”钩子”过程的返回值,返回值的类型依赖于”钩子”的类型。这个函数的原型如下:

LRESULT CallNextHookEx(

HHOOK hhk;

int nCode;

WPARAM wParam;

LPARAM lParam;

);

  其中hhk为当前”钩子”的句柄,由SetWindowsHookEx()函数返回。NCode为传给”钩子”过程的事件代码。wParam和lParam 分别是传给”钩子”过程的wParam值,其具体含义与”钩子”类型有关。

释放”钩子”

  释放”钩子”比较简单,他只有一个参数。当不在需要”钩子”时,应及时将其释放。他是调用UnhookWindowsHookEx()函数来实现的,函数原型如下:

UnhookWindowsHookEx(

HHOOK hhk;

);

函数成功返回TRUE,否则返回FALSE。

如果我这样讲您还是不明白的话,请看下面给出的一些典型“钩子”代码和说明。

LRESULT WINAPI CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)

{

if(nCode<0)

return CallNextHookEx(NULL,nCode,wParam,lParam);

switch(nCode)

{

case HC_ACTION:

//”钩子”程序要处理什么的代码

break;

default:

break;

}

return CallNextHookEx(NULL,nCode,wParam,lParam);

}

  这是WH_CALLWNDPROC”钩子”的代码,此”钩子”允许程序监视由函数SendMessage发送给窗口过程的消息。系统将消息发送到目的窗口之前调用WH_CALLWNDPROC “钩子”过程。

LRESULT WINAPI CallwndProc(int nCode,WPARAM,wParam,LPARAM lParam)

{

if(nCode<0) return callNextHookEx(NULL,nCode,wParam,lParam);

switch(nCode)

{

case HC_ACTION:

switch(wParam)

{

Case PM_REMOVE:

//某个应用程序调用了GetMessage函数或者是带PM_REMOVE参数的//PeekMessage函数,从消息队列中移去一个消息。

Break;

Case PM_NOREMOVE:

//某个应用程序以PM_NOREMOVE为参数调用PeekMessage函数

break;

default:

break;

}

break;

default:

break;

}

return CallNextHookEx(NULL,nCode,wParam,lParam);

}

  这是调用WH_GETMESSAGE的函数,此函数允许应用程序监视函数GetMessage和 PeekMessage返回的消息。应用程序可以用钩子WH_GETMESSAGE来监视鼠标和键盘的输入以及其他系统发送到消息队列中的消息。

LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)

{

If(nCode<0) Return callNextHookEx(NULL,nCode,wParam,lParam);

Switch(nCode)

{

case HCBT_ACTIVATE:

//系统将激活一个窗口

break;

case HCBT_CLICKSKIPPED:

//系统从系统消息队列中移去一个鼠标消息

break;

case HCBT_CREATEWND:

//系统将创建一个窗口

break;

case HCBT_DESTROYWND:

//系统将关闭一个窗口

break;

case HCBT_KEYSKIPPED:

//系统从系统消息队列中移去一个键盘消息

break;

case HCBT_MINMAX:

//系统将最大化或最小化一个窗口

break;

case HCBT_MOVESIZE:

//系统将移动一个窗口或改变一个窗口的大小

break;

case HCBT_QS:

//系统在系统消息队列中检索到WM_QUEUESYNC消息

break;

case HCBT_SETFOCUS:

//系统设置键盘输入窗口

break;

case HCBT_SYSCOMMAND:

//将要执行一个系统命令

break;

default:

//可以添加其他代码

break;

}

return CallNextHookEx(NULL,nCode,wParam,lParam);

}

  每种”钩子”类型都有其对应的函数,这些函数的参数都是一样的,有兴趣的朋友可以在MSDN中找的他们的详细说明。

下面我给出一个完整的”钩子”安装和删除的过程的代码。

#include "stdafx.h"

#include "hook.h"

HINSTANCE hInstance;

HHOOK hhkKeyboard;

BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

hInstance=(HINSTANCE)hModule;

return TRUE;

}

LRESULT KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)

{

MessageBeep(-1);

return CallNextHookEx(hhkKeyboard,nCode,wParam,lParam);

}

HOOK_API BOOL EnableKeyboardCapture()

{

if(!(hhkKeyboard=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInstance,0)))

return FALSE;

return TRUE;

}

HOOK_API BOOL DisableKeyboardCapture()

{

return UnhookWindowsHookEx(hhkKeyboard);

}

注意:这是一个动态链接库文件。

在程序中要想调用“钩子”的时候,有EnableKeyboardCapture()函数就可以啦,但你按键的时候就回发出声音。

立即下载

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00152