c#钩子实例

c#钩子实例
c#钩子实例

C#键盘勾子(Hook)拦截器,屏蔽键盘活动

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

运行机制

1、钩子链表和钩子子程:

每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook 子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Ho ok类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。

Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Ho ok链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。

钩子子程必须按照以下的语法:

LRESULT CALLBACK HookProc

(

int nCode,

WPARAM wParam,

LPARAM lParam

);

HookProc是应用程序定义的名字。

nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。

wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。

2、钩子的安装与释放:

使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的Hook链的开头的Hook子程。每一个Hoo k链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个Hook子程需要调用CallNextHookEx 函数。

HHOOK SetWindowsHookEx(

int idHook, // 钩子的类型,即它处理的消息类型HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0

// 或是一个由别的进程创建的线程的标识,

// lpfn必须指向DLL中的钩子子程。

// 除此以外,lpfn可以指向当前进程的一段钩子子程代码。

// 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的

DLL。

// 如果dwThreadId 标识当前进程创建的一个线程,

// 而且子程代码位于当前进程,hMod必须为NULL。

// 可以很简单的设定其为本应用程序的实例句柄。

DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。

// 如果为0,钩子子程与所有的线程关联,即为全局钩子。

);

函数成功则返回钩子子程的句柄,失败返回NULL。

以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程,且被钩子子程先处理。

在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数C allNextHookEx来传递它,以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值,返回值的类型依赖于钩子的类型。这个函数的原型如下:

LRESULT CallNextHookEx

(

HHOOK hhk;

int nCode;

WPARAM wParam;

LPARAM lParam;

);

hhk为当前钩子的句柄,由SetWindowsHookEx()函数返回。NCode为传给钩子过程的事件代码。

wParam和lParam 分别是传给钩子子程的wParam值,其具体含义与钩子类型有关。

钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。

钩子在使用完之后需要用UnHookWindowsHookEx()卸载,否则会造成麻烦。释放钩子比较简单,UnHookWindowsHookEx()只有一个参数。函数原型如下:

UnHookWindowsHookEx

(

HHOOK hhk;

);

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

3、一些运行机制:

在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。

因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。

#pragma data_seg预处理指令用于设置共享数据段。例如:

#pragma data_seg("SharedDataName")

HHOOK hHook=NULL;

#pragma data_seg()

在#pragma data_seg("SharedDataName")和#pragma data_ seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令#pragma comment(linker,"/section:.SharedDataNa me,rws"),那么这个数据节中的数据可以在所有DLL的实例之间共享。所有对这些数据的操作都针对同一个实例的,而不是在每个进程的地址空间中都有一份。

当进程隐式或显式调用一个动态库里的函数时,系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称"地址空间")。这使得DLL 成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈。

4、系统钩子与线程钩子:

SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。

线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。

系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序,所以勾子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程。

几点说明:

(1)如果对于同一事件(如鼠标消息)既安装了线程勾子又安装了系统勾子,那么系统会自动先调用线程勾子,然后调用系统勾子。

(2)对同一事件消息可安装多个勾子处理过程,这些勾子处理过程形成了勾子链。当前勾子处理结束后应把勾子信息传递给下一个勾子函数。

(3)勾子特别是系统勾子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装勾子,在使用完毕后要及时卸载

文章转自CSDN博客

C#键盘勾子(Hook)拦截器,屏蔽键盘活动源代码:

(易学原创代码)如转载请标明出处

using System;

using System.Collections.Generic;

using https://www.360docs.net/doc/0a51706.html,ponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.Reflection;

using System.Diagnostics;

using Microsoft.Win32;

namespace Vjsdn.Tech.KeyboardHook

{

public partial class frmKeyboardHook : Form

{

//勾子管理类

private KeyboardHookLib _keyboardHook = null;

public frmKeyboardHook()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

//安装勾子

_keyboardHook = new KeyboardHookLib();

_keyboardHook.InstallHook(this.OnKeyPress);

}

private void button2_Click(object sender, EventArgs e)

{

//取消勾子

if(_keyboardHook != null) _keyboardHook.UninstallHook();

}

///

/// 客户端键盘捕捉事件.

///

/// 由Hook程序发送的按键信息

/// 是否拦截

public void OnKeyPress(KeyboardHookLib.HookStruct hookStruct, out bool handle) {

handle = false; //预设不拦截任何键

if(hookStruct.vkCode == 91) // 截获左win(开始菜单键)

{

handle = true;

}

if(hookStruct.vkCode == 92)// 截获右win

{

handle = true;

}

//截获Ctrl+Esc

if(hookStruct.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)K eys.Control)

{

handle = true;

}

//截获alt+f4

if(hookStruct.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys. Alt)

{

handle = true;

}

//截获alt+tab

if(hookStruct.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys. Alt)

{

handle = true;

}

//截获F1

if(hookStruct.vkCode == (int)Keys.F1)

{

handle = true;

}

//截获Ctrl+Alt+Delete

if((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Dele te)

{

handle = true;

}

//如果键A~Z

if(hookStruct.vkCode >= (int)Keys.A && hookStruct.vkCode <= (int)Keys.Z)

{

//挡掉B键

if(hookStruct.vkCode == (int)Keys.B)

hookStruct.vkCode = (int)Keys.None; //设键为0

handle = true;

}

Keys key = (Keys)hookStruct.vkCode;

label1.Text = "你按下:" + (key == Keys.None ? "" : key.ToString());

}

}

}

KeyboardHookLib.cs

键盘管理类

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using System.Reflection;

using System.Diagnostics;

using Microsoft.Win32;

using System.Windows.Forms;

namespace Vjsdn.Tech.KeyboardHook

{

///

/// 键盘Hook管理类, by https://www.360docs.net/doc/0a51706.html, 易学原创

///

public class KeyboardHookLib

{

private const int WH_KEYBOARD_LL = 13; //键盘

//键盘处理事件委托,当捕获键盘输入时调用定义该委托的方法.

private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);

//客户端键盘处理事件

public delegate void ProcessKeyHandle(HookStruct param, out bool handle);

//接收SetWindowsHookEx返回值

private static int_hHookValue = 0;

//勾子程序处理事件

private HookHandle _KeyBoardHookProcedure;

//Hook结构

[StructLayout(LayoutKind.Sequential)]

public class HookStruct

{

public int vkCode;

public int scanCode;

public int flags;

public int time;

public int dwExtraInfo;

}

//设置钩子

[DllImport("user32.dll")]

private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hIn stance, int threadId);

//取消钩子

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConven tion.StdCall)]

private static extern bool UnhookWindowsHookEx(int idHook);

//调用下一个钩子

[DllImport("user32.dll")]

private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr l Param);

//获取当前线程ID

[DllImport("kernel32.dll")]

private static extern int GetCurrentThreadId();

//Gets the main module for the associated process.

[DllImport("kernel32.dll")]

private static extern IntPtr GetModuleHandle(string name);

private IntPtr _hookWindowPtr = IntPtr.Zero;

//构造器

public KeyboardHookLib() { }

//外部调用的键盘处理事件

private static ProcessKeyHandle _clientMethod = null;

///

/// 安装勾子

///

/// 外部调用的键盘处理事件

public void InstallHook(ProcessKeyHandle clientMethod)

{

_clientMethod = clientMethod;

// 安装键盘钩子

if(_hHookValue == 0)

{

_KeyBoardHookProcedure = new HookHandle(OnHookProc);

_hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.M oduleName);

_hHookValue = SetWindowsHookEx(

WH_KEYBOARD_LL,

_KeyBoardHookProcedure,

_hookWindowPtr,

0);

//如果设置钩子失败.

if(_hHookValue == 0) UninstallHook();

}

}

//取消钩子事件

public void UninstallHook()

{

if(_hHookValue != 0)

{

bool ret = UnhookWindowsHookEx(_hHookValue);

if(ret) _hHookValue = 0;

}

}

//钩子事件内部调用,调用_clientMethod方法转发到客户端应用。

private static int OnHookProc(int nCode, int wParam, IntPtr lParam)

{

if(nCode >= 0)

{

//转换结构

HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(Ho okStruct));

if(_clientMethod != null)

{

bool handle = false;

//调用客户提供的事件处理程序。

_clientMethod(hookStruct, out handle);

if(handle) return1; //1:表示拦截键盘,return退出

}

}

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

}

}

}

编写钩子程序实例

编写钩子程序的步骤分为三步:定义钩子函数、安装钩子和卸载钩子。 1.定义钩子函数 钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是各不相同的。下面以鼠标钩子函数举例说明钩子函数的原型: LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam) 参数wParam和lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。nCode包含有关消息本身的信息,比如是否从消息队列中移出。 我们先在钩子函数中实现自定义的功能,然后调用函数CallNextHookEx.把钩子信息传递给钩子链的下一个钩子函数。CallNextHookEx.的原型如下: LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ) 参数hhk是钩子句柄。nCode、wParam和lParam 是钩子函数。 当然也可以通过直接返回TRUE来丢弃该消息,就阻止了该消息的传递。 2.安装钩子 在程序初始化的时候,调用函数SetWindowsHookEx安装钩子。其函数原型为:HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId ) 参数idHook表示钩子类型,它是和钩子函数类型一一对应的。比如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示是鼠标钩子等等。 Lpfn是钩子函数的地址。 HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。 dwThreadId 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。 SetWindowsHookEx返回所安装的钩子句柄。 3.卸载钩子 当不再使用钩子时,必须及时卸载。简单地调用函数BOOL UnhookWindowsHookEx( HHOOK hhk)即可。 值得注意的是线程钩子和系统钩子的钩子函数的位置有很大的差别。线程钩子一般在当前线程或者当前线程派生的线程内,而系统钩子必须放在独立的动态链接库中,实现起来要麻烦一些。 线程钩子的编程实例: 按照上面介绍的方法实现一个线程级的鼠标钩子。钩子跟踪当前窗口鼠标移动的位置变化信息。并输出到窗口。 (1)在VC++6.0中利用MFC APPWizard(EXE)生成一个不使用文档/视结构的单文档应用mousehook。打开childview.cpp 文件,加入全局变量: HHOOK hHook;//鼠标钩子句柄 CPoint point;//鼠标位置信息 CChildView *pV iew; // 鼠标钩子函数用到的输出窗口指针 在CChildView::OnPaint()添加如下代码: CPaintDC dc(this);

记一次键盘记录器的编写

新建win32项目 键盘记录器的思路 1.窗口消息处理的框架 一注册窗口类 MyRegisterClass 二实例化并创建窗口 InitInstance 三处理窗口消息 WndProc 2.改造窗口,让它隐藏 3.1 WM_CREATE是窗口创建函数 3.2 WM_DESTROY是窗口关闭函数 建立之初,程序默认窗口是显示的,所以会建立一个ShowWindow(hWnd, nCmdShow); 我们要让他隐藏,那就要改第二个参数ShowWindow(hWnd, SW_HIDE); 3.让这个程序运行起来了就开始监控按键操作,程序结束了就结束监控. 那么我们怎么知道程序什么时刻运行起来了呢,我们是根据其窗口的创建与关闭来判断 在建立项目之初,他没有帮我们写WM_CREATE函数,所以在处理窗口消息部分WndProc 中写入case WM_CREATE: …………………… //这一部分就是窗口建立之后所运行的程序,我们在这一部分就

开始 //写我们所要实现的记录功能,我们称之为钩子函数。 以下为建立钩子程序 这个函数我们要在解决方案里重新新建一个空项目keyhook,后选择动态程序dll(动态加载,而不是 直接运行),实现这个功能,我们只要在这里调用函数即可 在建立keyhook项目完成后要新建一个头文件和cpp文件,来实现钩子的功能 接下来在头文件自己定义两个函数来启动钩子bool installhook(); 和关闭钩子bool uninstallhook(); 并且复制到cpp文件中, 注意:要让其他文件用到这两个函数,必须要在头文件中将两个函数改写成 extern"C"_declspec(dllexport) bool installhook(); “C”是指这是c语言代码 _declspec是一个函数 dllexport参数是动态库导出 要在键盘记录器的cpp文件中使用这两个函数,所以要包含其头文件,注意,由于所要包含的是一个动态库,所以是#pragma comment(lib,"keyhook"),而不是以前的#include,除此之外还要导入动态库中的函数,也就是将函数在声明一遍,记住要改dllexport成dllimport,因为这是导入,不是导出,如下 #pragma comment(lib,"keyhook")//导入动态库 //导入动态库中的函数 //启动钩子 extern"C"_declspec(dllimport) bool installhook(); //自己定义的函数 //关闭钩子 extern"C"_declspec(dllimport) bool uninstallhook(); 然后就开始写钩子程序 要实现以下功能 //获取用户的按键消息 用到SetWindowsHookEx函数,要包含Windows.h的头文件 SetWindowsHookEx(WH_KEYBOARD,keyProc,GetModuleHandle(L"keyhook"),NULL); 第一个参数代表的是我们要获取键盘的消息 第二个参数就是自己定义的函数,就是监控这个消息之后你要做什么事情(在这里就是同时获取当前窗口的标题并同时获取当前按下的按键文本并保存到文件中),这个函数的类型是HOOKPROC,按下F12后是typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam); 在这里我们定义这个函数为keyProc来实现这两个功能但我们得要在头文件中声明这个函数,然后才能在cpp文件中使用 这个功能用如下程序来实现 LRESULT CALLBACK keyProc(int code, WPARAM wParam, LPARAM lParam){ char szWriteText[256]; //用来保存标题和文本 char szWindowTitle[256]; //保存标题 char szKeyText[256]; //保存文本 //并同时获取当前窗口的标题

c#钩子实例

C#键盘勾子(Hook)拦截器,屏蔽键盘活动 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。 运行机制 1、钩子链表和钩子子程: 每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook 子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Ho ok类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。

Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Ho ok链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。 钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。 钩子子程必须按照以下的语法: LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam ); HookProc是应用程序定义的名字。 nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。

鼠标键盘钩子截获密码

利用鼠标键盘钩子截获密码。 源码示例:https://www.360docs.net/doc/0a51706.html,/soft/GetPass_Src.rar 钩子能截获系统并得理发送给其它应用程序的消息,能完成一般程序无法完成的功能。掌握钩子的编程方法是很有必要的 钩子分类: 1、WH_CALLWNDPROC和WH_CALLWNDPROCRET:使你可以监视发送到窗口过程的消息 3、WH_DEBUG 调试钩子 4、WH_FOREGROUNDIDLE 当当应用程序的前台线程大概要变成空闲状态时,系统就会调用 WH_FOREGROUNDIDL 5、WH_JOURNALRECORD 监视和记录输入事件 6、WH_JOURNALPLAYBACK 回放用WH_JOURNALRECORD记录事件 7、WH_KEYBOARD 键盘钩子 9、WH_KEYBOARD_LL 低层键盘钩子 10、WH_MOUSE 鼠标钩子 11、WH_MOUSE_LL 底层鼠标钩子 12、WH_SHELL 外壳钩子 13、WH_MSGFILTER 和WH_SYSMSGFILTER 使我们可以监视菜单,滚动条,消息框等 安装钩子: 调用函数SetWindowsHookEx安装钩子。其函数原型为: HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId ) idHook表示钩子类型,它是和钩子函数类型一一对应的。如,

WH_KEYBOARD,WH_MOUSE。 Lpfn是钩子函数的地址。 HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。(系统钩子必须在DLL中) dwThreadId 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。 SetWindowsHookEx返回所安装的钩子句柄。 卸载钩子 调用函数BOOL UnhookWindowsHookEx( HHOOK hhk)卸载钩子 定义钩子函数 钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。一般为下: LRESULT WINAPI MyHookProc(int nCode ,WPARAM wParam,LPARAM lParam) 参数wParam和lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。nCode 包含有关消息本身的信,比如是否从消息队列中移出。 实例: 下面我们通过安装鼠标钩子。和键盘钩子还截获输入的密码,并可查看*密码为例,来说明何何使用钩子。 1,进入向导,新建MFC AppWizard(dll) 取名为GetPass,选择MFC Extension DLL,完成。 2,新建一个CGetPassHook 类,基类:CObject,并加入StartHook,StopHook,函数,如下:class AFX_EXT_CLASS CGetPassHook : public CObject { public: BOOL StopHook();

游戏辅助制作原理

游戏辅助制作原理 目录 一、前言 (1) 二、认识辅助 (1) 三、辅助技术综述 (2) 动作模拟技术 (2) 封包技术 (9) 结束语 (13) 一、前言 游戏外辅程序,可以协助玩家自动产生游戏动作、修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将。虽然,现在对游戏辅助程序的“合法”身份众说纷纭,在这里我不想对此发表任何个人意见,让时间去说明一切吧。 不管游戏辅助程序是不是“合法”身份,但是它却是具有一定的技术含量的,在这些小小程序中使用了许多高端技术,如拦截Sock技术、拦截API技术、模拟键盘与鼠标技术、直接修改程序内存技术等等。本文将对常见的游戏辅助中使用的技术进行全面剖析。 二、认识辅助 游戏辅助的历史可以追溯到单机版游戏时代,只不过当时它使用了另一个更通俗易懂的名字——游戏修改器。它可以在游戏中追踪锁定游戏主人公的各项能力数值。这样玩家在游戏中可以达到主角不掉血、不耗费魔法、不消耗金钱等目的。这样降低了游戏的难度,使得玩家更容易通关。 随着网络游戏的时代的来临,游戏辅助在原有的功能之上进行了新的发展,它变得更加多种多样,功能更加强大,操作更加简单,以至有些游戏的辅助已经成为一个体系,比如《石器时代》,辅助品种达到了几十种,自动战斗、自动行走、自动练级、自动补血、加速、不遇敌、原地遇敌、快速增加经验值、按键精灵……几乎无所不包。 游戏辅助的设计主要是针对于某个游戏开发的,我们可以根据它针对的游戏的类型可大致可将辅助分为两种大类。 一类是将游戏中大量繁琐和无聊的攻击动作使用辅助自动完成,以帮助玩家轻松搞定攻击对象并可以快速的增加玩家的经验值。比如在《龙族》中有一种工作的设定,玩家的工作等级越高,就可以驾驭越好的装备。但是增加工作等级却不是一件有趣的事情,毋宁说是重复枯燥的机械劳动。如果你想做法师用的杖,首先需要做基本工作--?砍树。砍树的方法很

VB 钩子详解

Windows钩子函数的概念和实现方法 首先我们必须大致了解Windows的基本运作机理,Windows作为一个多任务操作系统,它是分有层次概念的,运行在最底下的称为Ring 0层,在这一层里基本上都是一些硬件驱动程序和Windows的总内核,一般的应用程序极少极少运行在这层,当然也有例外,例如调试软件SoftICE(不过基本上这个软件的作用是Crack软件而不是调试)、还原精灵还有分区魔法大师,就是运行在Ring 0层的,另外就是著名的CIH病毒。运行在Ring 0级的程序能够对所有硬件进行直接地址级访问,所受到的限制也最小。 消息(Message)传递是Windows独有的一种机制,因为Windows规定运行在Ring 0以上的程序是没有权利知道究竟硬件发生了怎样的中断变化的,Windows统一将这些中断变化封装成一系列的消息(黑箱作业,也就是常说的Black Box),比如鼠标移动,系统产生一个OnMouseMove消息(但这条消息从何而来,相关的硬件中断向量是什么,程序无从得知),OnMouseMove这条消息最后送达每一个窗口程序以供处理。在更高层次的地方,比如说控件级,所有的消息还被封装成一系列“事件”,比如TextBox控件有KeyPress事件,实际上,这些事件都是林林种种的消息映射。事件的概念使得程序员能够更加傻瓜化地进行编程,但是从另一个角度来说,这种黑箱作业也使得程序员过分依赖系统的安排,限制了程序员的思维,举个例子,Windows为按钮控件封装了大部分常用的属性和事件,完成一般的常规妈作是没有问题的,但是很遗憾,或许是Windows的疏忽,按钮控件的字体颜色永远默认是黑色,而且Windows没有为此提供一个专门的接口来修改,碰到这种情况,程序员就会非常头疼。 钩子函数(Hook Function),就像一把钩子,它的作用是将消息在抵达窗口程序之前先钩到一个地方以便程序员进行分析,这个地方称为挂接函数链,消息在这里先被一系列的函数处理然后由程序员决定是否交还给Windows系统,在这里,你可以“吞噬”(Lickup)一些你不希望发生的消息,比如说你吞掉所有的键盘消息而不交还给系统,那么键盘将会失灵。当然,经过了这道周折,系统效率将会有极其微小的降低,但是,由于Windows规定所有不运行在Ring 0层的程序都不能直接访问硬件中断,因此作为一种中断驱动程序的补充,钩子函数在很多场合下是非常有用的,有时候甚至是唯一的方法。 下面就以键盘拦截为例讲述钩子函数的使用方法: 首先定义以下API: Public Declare Function SetWindowsHookEx Lib "user32" _ Alias "SetWindowsHookExA" (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long SetWindowsHookEx,这个函数是一切钩子函数的根本,其作用是通知Windows进行钩子妈作并定义钩子函数。 参数1,idHook为定义需要进行的拦截类型,是键盘拦截?鼠标拦截?还是别的。如 WH_KEYBOARD捕捉键盘消息,而WH_MOUSE捕捉鼠标消息。

消息钩子函数入门篇.docx

消息钩子函数入门篇 Windows系统是建立在事件驱动的机制上的,说穿了就 是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词, 日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。 钩子的类型 一.按事件分类,有如下的几种常用类型 (1)键盘钩子和低级键盘钩子可以监视各种键盘消 /息、O (2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。 (3)外壳钩子可以监视各种Shell事件消息。比如启动和关闭应用程序。 (4)日志钩子可以记录从系统消息队列中取出的各种 事件消息。 (5)窗口过程钩子监视所有从系统消息队列发往目标窗口的

消息。 此外,还有一些特定事件的钩子提供给我们使用,不列举。 下面描述常用的Hook类型: 1、WH_CA LLWNDPROC 和WH_CALLWND PROCRETHoo ks WH_CAL LWNDPROC 和W H_CALLWNDP ROCRETHook s 使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_C ALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALL WNDPR0 CR ETHook 子程。W H_CALLWNDP ROCRETHook 传递指针到CWPRE TSTRUCT 结构,再传递到Hook 子程。CWPRETSTR UCT 结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。 2、WH_CB THook 在以下事件之前,系统都会调用WH_CBTHoo k子程,这些事件包括: 1.激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件; 2.完成系统指令; 3.来自系统消息队列中的移动鼠标,键盘事件; 4.设置输入焦点事件; 5 ?同步系统消息队列事件。

c语言键盘钩子

在开始贴这段垃圾代码以前,先给大家道个歉,也先扇自己一巴掌。本来说好昨天把代码搞好的,谁知道还没开始整,就过了12点了,食言了。 代码还没有怎么写好,先把关键代码粘贴出来,等今天晚上把代码整理好,功能完善了再修改这个文章,顺便把写程序的过程、遇到的问题以及关键思路写出来。 下面是DLL的关键代码(C语言编写,考虑DLL的兼容性): //////////////////////////////////// //keyhook.c //作用:DLL主文件 //作者:zaroty //时间:2008年9月9日0:54:39 //博客:https://www.360docs.net/doc/0a51706.html,/zaroty /////////////////////////////////// #define _WIN32_WINNT 0x0500 //底层钩子需要设置系统版本号 #include #include #include "keyhook.h" #include "vKey.h" HHOOK CuhHook=NULL; HANDLE g_hModule; BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH: g_hModule = (HINSTANCE)hModule; break; case DLL_PROCESS_DETACH: g_hModule=NULL; break; } return TRUE; } LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam ) { KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam; LPCSTR log=GetKeyName(pStruct->vkCode); if (wParam==WM_KEYDOWN) {

hook的使用实例

在网上找了好久都没有找到消息hook的实例,下面是我的例子给大家分享一下 下面是dll中的代码: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //我的经验,编译的时候会提示DllMain,已在DllMain.cpp中定义,把DllMain.cpp从源文件里删掉就好了 #include "stdafx.h" #include HHOOK hkey=NULL; HINSTANCE h_dll; #pragma data_seg(".MySec") //定义字段,段名.MySec HWND h_wnd=NULL; #pragma data_seg() #pragma comment(linker,"/section:.MySec,RWS") BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { h_dll=hinstDLL; // MessageBox(0,"运行dllman","",MB_OK); return TRUE; } LRESULT CALLBACK my_test(int nCode,WPARAM wParam,LPARAM iParam)// { /* if(nCode==HC_ACTION) { MessageBox(0,"成功!!","标题",MB_OK); } else { MessageBox(0,"失败!!","标题",MB_OK); } */ MessageBox(0,"被截取","",MB_OK); UnhookWindowsHookEx(hkey); return 1; } void SetHook(HWND hwnd) { h_wnd = hwnd; // MessageBox(0,"运行sethook","",MB_OK); hkey=SetWindowsHookEx(WH_KEYBOARD,my_test,h_dll,0); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 下面是EXE的代码:有很多头文件是没用上的,我个人习惯都带着- -,虽然这不是好习惯

第4章钩子函数和窗口子类化

第4章钩子函数和窗口子类化 钩子是操作系统消息处理的一种机制。通过钩子,应用程序可以安装一个钩子回调过程让系统调用,从而监视系统中的消息队列,在这些消息到达目标窗口之前对这些消息进行处理。 本章主要介绍钩子函数的基本概念以及几种常用钩子的应用举例。 4.1 钩子函数 早在Windows3.x的时候,就有了钩子函数,它经历了Windows9x/NT/2000/XP/2003各个操作系统,始终保持了最大的兼容性。可以说大部分的钩子函数适用于现在所有的Win32操作系统,钩子函数在系统编程方面有着广泛的应用前景。 首先应该承认钩子会降低系统的性能,因为它增加系统处理每一个消息的开销,所以用户除非必要才安装钩子,而且还要尽可能早地去除钩子。 操作系统支持多种类型的钩子,每种类型都提供了它特有的消息处理机制,比如应用程序使用WH_MOUSE钩子只能监视鼠标的消息队列。对于每种类型的钩子,系统都维护一个各自独立的钩子链,钩子链是一个指向用户提供的回调函数钩子过程的链表指针。当与特定类型的钩子相关的窗口消息发生时,系统会把消息依次传递给钩子链中的每一个回调过程,传递的过程由用户定义的回调过程实现。一般情况下,用户提供的钩子回调过程必须调用钩子链中的下一个回调过程。否则钩子处理可能会中断,出现不可预测的结果。钩子过程可以监视窗口消息,也可以修改甚至停止钩子消息的继续传递,不让它到达钩子链中的下一个目标过程。 钩子过程需要用户调用SetWindowsHookEx函数进行安装。钩子过程一般遵循下面的调用规范。 LRESULT CALLBACK HookProc(intnCode,WPARAMwParam,LPARAMlParam);其中HookProc是应用程序提供的函数名。nCode参数是一个钩子标识码,钩子过程会利用它决定下一步进行的操作。这个标识码的值与安装的钩子类型有关。每种类型都有它的自身定义。后面两个参数的定义依赖于nCode参数,一般用于存放与窗口消息相关的内容。SetWindowsHookEx函数会自动安装一个钩子过程,这个过程位于钩子链表的头部,最后安装的钩子函数总是最先得到响应。前面的钩子处理过程可以决定是否调用钩子链中的下一个过程,这可以通过调用CallNextHookEx函数实现。 注意:某些钩子类型能够监视发生的窗口消息系统自动把消息依次传递给钩子链中的每一个钩子过程,而不管用户是否调用CallNextHookEx函数。 全局钩子会监视同一桌面环境下所有的窗口消息,而线程钩子只能监视单个线程内发生的消息。由于全局钩子能够在同一桌面的所有应用环境下调用,所有这个钩子过程必须在一个动态链接库中实现。 注意:全局钩子一般只用于调试目的,应尽可能地避免使用。全局钩子会显著地降低系统的性能,增加系统的开销,并可能会与安装同一全局钩子的应用程序发生冲突。钩子函数的处理应该尽可能简单,并要快速退出。对于处理复杂的过程,可以借助于发送异步处理窗口消息的方式实现。 操作系统提供了以下一些钩子,这些钩子允许用户监视系统消息处理的某一个方面。如表4-1所示: 安装钩子函数要用到SetWindowsHookEx函数。对于全局钩子而言,钩子过程必须在一个动态链接库模块中实现,这个过程必须作为动态链接库的输出函数,以便能够在安装钩子程序中通过调用LoadLibrary/GetProcAddress函数获得回调过程的地址,然后把回调函数的地址传递给SetWindowsHookEx函数。 HOOK PROC hkprcSys Msg; Static HINSTANCE hinstDLL; Static HHOOK hhookSysMsg; hinstDLL=LoadLibrary((LPCTSTR)"c:\\windows\\sysmsg.dll");

Python中使用PyHook监听鼠标和键盘事件实例

Python中使用PyHook监听鼠标和键盘事件实例 PyHook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件。这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台。关于PyHook的使用,在它的官方主页上就有一个简单的教程,大体上来说,可以这样使用 ?123456789101112131415161718192021222324252627282930 313233343536373839404142434445464748495051525354555 6 # -*- coding: utf-8 -*- # 3import pythoncom 4import pyHook 5def onMouseEvent(event): # 监听鼠标事件print "MessageName:",event.MessageName print "Message:", event.Message print "Time:", event.Time print "Window:", event.Window print "WindowName:", event.WindowName print "Position:", event.Position print "Wheel:", event.Wheel print "Injected:", event.Injected print"---" # 返回

True 以便将事件传给其它处理程序# 注意,这儿如果返回False ,则鼠标事件将被全部拦截# 也就是说你的鼠标看起来会僵在那儿,似乎失去响应了return True 23def onKeyboardEvent(event): # 监听键盘事件print "MessageName:", event.MessageName print "Message:", event.Message print "Time:", event.Time print "Window:", event.Window print "WindowName:", event.WindowName print "Ascii:", event.Ascii, chr(event.Ascii) print "Key:", event.Key print "KeyID:", event.KeyID print "ScanCode:", event.ScanCode print "Extended:", event.Extended print "Injected:", event.Injected print "Alt", event.Alt print "Transition", event.Transition print "---" # 同鼠标事件监听函数的返回值return True 42def main(): # 创建一个“钩子”管理对象hm = pyHook.HookManager() # 监听所有键盘事件 hm.KeyDown = onKeyboardEvent # 设置键盘“钩子”hm.HookKeyboard() # 监听所有鼠标事件 hm.MouseAll = onMouseEvent # 设置鼠标“钩子”hm.HookMouse() # 进入循环,如不手动关闭,程序将一直处于监听状态pythoncom.PumpMessages() 56if __name__ == "__main__": main()

综合课程设计报告--键盘输入截获系统的设计与实现

综合课程设计报告--键盘输入截获系统的设计与实现

键盘输入截获系统的设计与实现 摘要 Windows系统键盘截获系统,在我们的生活中是很常见的,比如在军方的某些系统中,为确保某些机密信息不被泄露出去,就要求在工作人员在于外界交流的时候,无意中输出的可能隐含机密信息不被发送出去,此时可以设置关键字,使用钩子来屏蔽这些信息,不让其发送出去,这样就很好的杜绝了机密信息的泄露的发生,提高军方系统的安全性,以上是一个很常见的例子,那么当提及到Windows系统信息截获,不得不想到动态链接库和钩子,动态链接库在Windows 系统中无处不在,编程过程中,调用的所有的API都是从系统动态链接库导出的,实际上,不使用动态链接库几乎是不可能的,因为Windows 提供给编程人员的几乎所有功能都驻留在动态链接库中。 Windows 应用程序的运行模块是基于消息驱动的,任何线程只要注册了窗口类都会有一个消息队列来接收用户的输入消息和系统消息。为了取得特定线程接收或者发送的消息,就要用到Windows提供的钩子。Windows钩子广泛应用

于各种检测侦查程序中,如输入监视、API截获等。一般的钩子函数都必须写在动态链接库中,以便注入到其进程。 一、需求分析 1、实验要求: 设计一个基于Windows或Linux的键盘输入捕获系统,对特定键盘输入进行检测过滤。要求如下: (1)设计一个键盘钩子程序捕获键盘动作,捕获任意窗口上的键盘输入,并进行记录; (2)能监控QQ、MSN、word、Excel、记事本、IE网页等应用程序; (3)设置一些关键词,根据键盘输入,设计一种关键词检测的方法,能在记录的键盘输入中检测出关键词出现的位置; (4)对输入的关键词,进行过滤,阻止其在相关的应用程序中输出; 2、实验环境: Microsoft Visual studio 2010 二、实验分组情况: 三、实验原理概述: 钩子:钩子是Windows中可以拦截事件的一种机制,可以指定一个函数作为特定类型的 被拦截事件的钩子过程。钩子过程可以对 拦截的每个事件进行处理。不同类型的钩 子可以为消息处理机制的不同方面提供 访问,例如,WH_MOUSE钩子可以监视与 鼠标操作相关的消息。系统为每一个类型 的钩子维护一个独立的钩子链,其中包含 指定一组作为钩子过程的回调函数指针。 当与指定类型的钩子相关联的消息发生

C#键盘钩子拦截键盘按键

C#键盘钩子,本文以C#语言为例,演示拦截键盘按键。首先打开VS创建一个窗体应用程序。如图: 需要引入以下两个命名空间。 using System.Runtime.InteropServices; using System.Diagnostics; 以下是全部源码: using System; using System.Collections.Generic; using https://www.360docs.net/doc/0a51706.html,ponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices;

using System.Diagnostics; namespace WindowsForms5107 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //定¨义?一?个?结á构1 public struct HookStruck { public int vkCode; public int scanCode; public int time; } public delegate int FunctionAddr(int ncode,IntPtr wParam,IntPtr iparam); [DllImport("user32.dll")] //参?数簓介é绍Θ?:阰hookID表括?示?参?数簓类え?型í,?有瓺鼠酣?标括?钩3子哩?,?键ü盘ì钩3子哩?等台?类え?型í,?callfunction:阰回?调獭?函ˉ数簓地?址·,?即′你?要癮转羇而?执′行D的?程ì序?地?址·。£ //hInstance:钩3子哩?程ì序?的?实害??柄括?。£threadID线?程ìId,你?要癮监à视酣?的?程ì序?的?iD,当獭纈d=0时骸?,?为a系μ统?钩3子哩?,?监à控?整?个?系μ统?

钩子函数

CallNextHookEx 函数功能:该函数发送挂钩信息给当前挂钩链中的下一个挂钩处理过程,一个挂钩处理过程可在对该挂钩信息进行处理之前或之后调用本函数. 函数原形:LRESULT CallNextHookEx(HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam); 参数: hhk:当前挂钩的句柄.一个应用程序获得的此句柄是此前SetWindowsHookEx的调用结果. nCode:指定发送给当前挂钩处理过程的挂钩代码.下一个挂钩处理函数使用此代码以决定如何处理该挂钩信息. wParam:指定发送给当前挂钩处理过程的wParam值,此参数的含义依赖于与当前挂钩相关的挂钩类型 lParam:指定发送给当前挂钩处理过程的lParam值,此参数的含义依赖于与当前挂钩相关的挂钩类型. 返回值:其返回值是链中下一个挂钩处理过程的返回值,当前的挂钩处理过程也必须返回此值,此返回值的含义依赖与挂钩的类型,如果希望获得更多的信息,可参阅关于独立挂钩处理过程的介绍. 备注:挂钩处理过程被安置于不同的具有一定挂钩类型的挂钩链中,函数CallNextHookEx调用该链中的下一个挂钩.对函数CallNextHookEx的调用是可选的,但同时也是被极力推荐使用的,否则其他安装了挂钩的应用程序将无法收到挂钩通知,由此可能导致错误的行为.除非您确实需要使其他应用程序不能此挂钩通知,否则,您应该调用此函数CallNextHookEx. 速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:user32.lib. CallWndProc 函数功能:该函数挂钩处理过程是由应用程序定义或由库定义的回调函数,它与函数SetWindowsHookEx配套使用,系统调用此函数无论何时一旦函数SendMessage被调用,在将消息发送至相应的窗口处理过程之前,系统先将该消息发送至挂钩处理过程,该挂钩处理过程可以对改消息进行检查,但不能修改之. 类型HOOKPROC定义了指向此类回调函数的指针,CallWndProc是应用程序定义或库定义的函数名的位置标志位. 函数原形:LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam ); 参数: nCode:指定该挂钩处理过程是否必须对该消息进行处理,若nCode 是HC_ACTION,则该挂钩处理过程必须处理该消息.若nCode的值小于0,则此挂钩处理过程必须在未对该消息作进一

用VB实现的全局键盘钩子

用VB实现的全局键盘钩子 2010-04-06 13:30 代码功能:实时监测Caps Lock、NumLock、Scroll Lock三个按件的状态,并显示在Label1 Label2 Label3三个标签中 '.bas模块中 Public m_hDllKbdHook As Long 'public variable holding 'the handle to the hook procedure Public Const WH_KEYBOARD_LL As Long = 13 'enables monitoring of keyboard 'input events about to be posted 'in a thread input queue Private Const HC_ACTION As Long = 0 'wParam and lParam parameters 'contain information about a 'keyboard message Public Const VK_CAPITAL As Long = &H14 Public Const VK_NUMLOCK As Long = &H90 Public Const VK_SCROLL As Long = &H91 Private Const LLKHF_UP As Long = &H80& 'test the transition-state flag Public Type KeyboardBytes kbByte(0 To 255) As Byte End Type Private Type KBDLLHOOKSTRUCT vkCode As Long 'a virtual-key code in the range 1 to 254 scanCode As Long 'hardware scan code for the key flags As Long 'specifies the extended-key flag, 'event-injected flag, context code, 'and transition-state flag time As Long 'time stamp for this message dwExtraInfo As Long 'extra info associated with the message End Type Public Declare Function SetWindowsHookEx Lib "user32" _ Alias "SetWindowsHookExA" _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long

钩子函数捕捉键盘消息

利用钩子函数来捕捉键盘响应的windows应用程序一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到了windows的钩子函数。因此本文将对钩子函数的相关知识进行阐述。当然,本文的目的并不是想通过此程序让读者去窃取别人的密码,只是由于钩子函数在windows系统中是一个非常重要的系统接口函数,所以想和大家共同的探讨,当然本文也对怎样建立动态连结库(DLL)作了一些简单的描述。(本文的程序为vc6.0的开发环境,语言是:C和win32 api)。 二:钩子概述: 微软的windowsX操作系统是建立在事件驱动的机制上的,也就是通过消息传递来实现。而钩子在windows操作系统中,是一种能在事件(比如:消息、鼠标激活、键盘响应)到达应用程序前中途接获事件的机制。而且,钩子函数还可以通过修改、丢弃等手段来对事件起作用。 Windows 有两种钩子,一种是特定线程钩子(Thread specific hooks),一种是全局系统钩子(Systemwide hooks)。特定线程钩子只是监视指定的线程,而全局系统钩子则可以监视系统中所有的线程。无论是特定线程钩子,还是全局系统钩子,都是通过SetWindowsHookEx ()来设置钩子的。对于特定线程钩子,钩子的函数既可以是包含在一个.exe也可以是一个.dll。但是对于一个全局系统钩子,钩子函数必须包含在独立的dll中,因此,当我们要捕捉键盘响应时,我们必须创建一个动态链接库。但是当钩子函数在得到了控制权,并对相关的事件处理完后,如果想要该消息得以继续的传递,那么则必须调用另一个函数:CallNextHookEx。由于系统必须对每个消息处理,钩子程序因此增加了处理的负担,因此也降低了系统的性能。鉴于这一点,在windows ce中对钩子程序并不支持。所以当程序完成并退出时,应当释放钩子,调用函数:UnhookWindowsHookEx。 下面我们将举一个例子(捕捉键盘)来详细的讲解钩子函数的程序设计。 三:程序的设计: I:设置钩子 设置钩子是通过SetWindowsHookEx ()的API函数. 原形: HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId) idhook:装入钩子的类型. lpfn: 钩子进程的入口地址 hMod: 应用程序的事件句柄 dwThreadId: 装入钩子的线程标示 参数: idHook: 这个参数可以是以下值: WH_CALLWNDPROC、WH_CALLWNDPROCRET、WH_CBT、WH_DEBUG、WH_FOREGROUNDIDLE、 WH_GETMESSAGE、WH_JOURNALPLAYBACK、WH_JOURNALRECORD、WH_KEYBOARD、WH_KEYBOARD_LL、

相关文档
最新文档