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

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

C#键盘钩子,本文以C#语言为例,演示拦截键盘按键。首先打开VS创建一个窗体应用程序。如图:

需要引入以下两个命名空间。

using System.Runtime.InteropServices;

using System.Diagnostics;

以下是全部源码:

using System;

using System.Collections.Generic;

using https://www.360docs.net/doc/2f4993122.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子哩?,?监à控?整?个?系μ统?

private static extern int SetWindowsHookEx(int hookID,FunctionAddr callFunction,IntPtr hInstance,int threadId);

[DllImport("kernel32.dll")]

//获?取?应畖用?程ì序?句?柄括?

private static extern IntPtr GetModuleHandle(string name);

[DllImport("user32.dll")]

//钩3子哩?卸?载?

private static extern bool UnhookWindowsHookEx(IntPtr hWnd);

private void button1_Click(object sender, EventArgs e)

{

this.InstaHook();

}

IntPtr _hookWindowPtr = IntPtr.Zero;

private void InstaHook()

{

FunctionAddr callbac = new FunctionAddr(CallBackFunction);

string modname = Process.GetCurrentProcess().MainModule.ModuleName;

int WH_HOOKid = 13;

_hookWindowPtr = (IntPtr)GetModuleHandle(modname);

IntPtr hookvalue =

(IntPtr)SetWindowsHookEx(WH_HOOKid,callbac,_hookWindowPtr,0);

}

private int CallBackFunction(int ncode,IntPtr wParam,IntPtr iparam)

{

HookStruck hookstruck = (HookStruck)Marshal.PtrToStructure(iparam,typeof(HookStruck));

//注痢?意癮65,90分?别纄是?A,?Z的?ASCII码?,?即′当獭?检ì测a按恪?下?A-Z时骸?,?执′行D拦?截?操ù作痢?

if(hookstruck.vkCode>=65&&hookstruck.vkCode<=122)

{

this.textBox1.Text = "按恪?键ü" + (char)hookstruck.vkCode + "已?拦?截?";

}

return 0;

}

private void button2_Click(object sender, EventArgs e)

{

//钩3子哩?卸?载?

bool result = true;

IntPtr hooxUn = (IntPtr)GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);

if (hooxUn != IntPtr.Zero)

{

result = (UnhookWindowsHookEx(_hookWindowPtr)&&result);

}

}

}

}

演示效果:

记一次键盘记录器的编写

新建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/2f4993122.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技术、模拟键盘与鼠标技术、直接修改程序内存技术等等。本文将对常见的游戏辅助中使用的技术进行全面剖析。 二、认识辅助 游戏辅助的历史可以追溯到单机版游戏时代,只不过当时它使用了另一个更通俗易懂的名字——游戏修改器。它可以在游戏中追踪锁定游戏主人公的各项能力数值。这样玩家在游戏中可以达到主角不掉血、不耗费魔法、不消耗金钱等目的。这样降低了游戏的难度,使得玩家更容易通关。 随着网络游戏的时代的来临,游戏辅助在原有的功能之上进行了新的发展,它变得更加多种多样,功能更加强大,操作更加简单,以至有些游戏的辅助已经成为一个体系,比如《石器时代》,辅助品种达到了几十种,自动战斗、自动行走、自动练级、自动补血、加速、不遇敌、原地遇敌、快速增加经验值、按键精灵……几乎无所不包。 游戏辅助的设计主要是针对于某个游戏开发的,我们可以根据它针对的游戏的类型可大致可将辅助分为两种大类。 一类是将游戏中大量繁琐和无聊的攻击动作使用辅助自动完成,以帮助玩家轻松搞定攻击对象并可以快速的增加玩家的经验值。比如在《龙族》中有一种工作的设定,玩家的工作等级越高,就可以驾驭越好的装备。但是增加工作等级却不是一件有趣的事情,毋宁说是重复枯燥的机械劳动。如果你想做法师用的杖,首先需要做基本工作--?砍树。砍树的方法很

消息钩子函数入门篇.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 ?同步系统消息队列事件。

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捕捉鼠标消息。

c语言键盘钩子

在开始贴这段垃圾代码以前,先给大家道个歉,也先扇自己一巴掌。本来说好昨天把代码搞好的,谁知道还没开始整,就过了12点了,食言了。 代码还没有怎么写好,先把关键代码粘贴出来,等今天晚上把代码整理好,功能完善了再修改这个文章,顺便把写程序的过程、遇到的问题以及关键思路写出来。 下面是DLL的关键代码(C语言编写,考虑DLL的兼容性): //////////////////////////////////// //keyhook.c //作用:DLL主文件 //作者:zaroty //时间:2008年9月9日0:54:39 //博客:https://www.360docs.net/doc/2f4993122.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) {

第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");

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

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

键盘输入截获系统的设计与实现 摘要 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钩子可以监视与 鼠标操作相关的消息。系统为每一个类型 的钩子维护一个独立的钩子链,其中包含 指定一组作为钩子过程的回调函数指针。 当与指定类型的钩子相关联的消息发生

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()

hook捕捉鼠标的键盘的操作

HOOK技术,对大家来说,应该不是很陌生吧,在我们日常的工作中,或多或少会去捕捉鼠标的移动轨迹或者键盘的操作,此时hook就派上用场了,hook的使用很简单: 1:建立hook(用于捕捉鼠标的操作) BOOL InstallHook() { hinst = AfxGetInstanceHandle(); hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)LowLevelMouseProc, hinst, 0); //标注的是调用hook响应函数 if(!hMouseHook) return false; return true; } 2:响应hook的函数 LRESULT CALLBACK LowLevelMouseProc(intnCode, WPARAM wParam, LPARAM lParam) { FILE *fp = NULL; HWND hwnd; MSLLHOOKSTRUCT *mhsLParam; mhsLParam = (MSLLHOOKSTRUCT*)(lParam); if (nCode< 0) // do not process the message { returnCallNextHookEx(hMouseHook, nCode, wParam, lParam); } else { hwnd = hDlg; } switch(wParam) { case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: PostMessage(hwnd, WM_USER+wParam, 0, 0); break; case WM_MOUSEMOVE: PostMessage(hwnd, WM_USER+wParam, mhsLParam->pt.x, mhsLParam->pt.y); break; }

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

C#键盘钩子,本文以C#语言为例,演示拦截键盘按键。首先打开VS创建一个窗体应用程序。如图: 需要引入以下两个命名空间。 using System.Runtime.InteropServices; using System.Diagnostics; 以下是全部源码: using System; using System.Collections.Generic; using https://www.360docs.net/doc/2f4993122.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子哩?,?监à控?整?个?系μ统?

钩子函数捕捉键盘消息

利用钩子函数来捕捉键盘响应的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、

用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

C#键盘钩子实现全局快捷键

C#键盘钩子实现全局快捷键 本文介绍如何使用Win32Api创建键盘钩子,并编写一个使用全局快捷键的实例。 工具/原料 Visual Studio(本文使用VS2013,其他版本亦可)。 基础知识 1 使用钩子之前,需要使用SetWindowsHookEx()函数创建钩子,使用完毕之后要UnhookWindowsHookEx()函数卸载钩子,“钩”到消息后操作系统会自动调用在创建钩子时注册的回调函数来处理消息,处理完后调用CallNextHookEx()函数等待或处理下一条消息。有关钩子的详细信息请见参考--C#鼠标钩子,其中已介绍。 2 对于键盘钩子,钩子类型为WH_KEYBOARD_LL=13,只需要设置SetWindowsHookEx的idHook 参数为13即可“钩”到键盘消息。关于钩子类型的资料见参考资料--钩子类型。 END 键盘钩子实例 启动VS,新建C# WinForm项目,命名为“Cs键盘钩子”,如下: 对主窗口布局,如下: 添加Win32Api引用,代码如下: using System; using System.Collections.Generic; using System.Linq;

using System.Text; using System.Runtime.InteropServices; using System.Reflection; using System.Threading; using System.Windows.Forms; using System.Diagnostics; public class Win32Api { #region常数和结构 public const int WM_KEYDOWN = 0x100; public const int WM_KEYUP = 0x101; public const int WM_SYSKEYDOWN = 0x104; public const int WM_SYSKEYUP = 0x105; public const int WH_KEYBOARD_LL = 13; [StructLayout(LayoutKind.Sequential)] //声明键盘钩子的封送结构类型public class KeyboardHookStruct { public int vkCode; //表示一个在1到254间的虚似键盘码 public int scanCode; //表示硬件扫描码 public int flags; public int time; public int dwExtraInfo; } #endregion #region Api public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); //安装钩子的函数 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); //卸下钩子的函数 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); //下一个钩挂的函数 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, Int32wParam, IntPtr lParam); [DllImport("user32")] public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState);

相关文档
最新文档