钩子是一种什么格式的文件

钩子是一种什么格式的文件,第1张

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。Hook API是指Windows开放给程序员的编程接口,使得在用户级别下可以对 *** 作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能,Hook API的意思就是在这些应用程序调用真正的系统API前可以先被截获,从而进行一些处理再调用真正的API来完成功能。

HOOK分为三种:LOCAL HOOK 和 REMOTE HOOK,还有一种是SYSTEM-WIDE LOCAL HOOK。LOCAL HOOK就是指程序HOOK的就是本程序中的线程。REMOTE HOOK有两种形式:一种是对其他程序中某个特定的线程;一种是对整个系统。SYSTEM–WIDE LOCAL HOOK 是一种比较特殊的。它具有REMOTE HOOK的功能,又可以用LOCAL HOOK 的表现手法,实际上就是WH_JOURNALRECORD和WH_JOURNALPLAYBACK两种HOOK。REMOTE HOOK 必须封装在DLL中。这是因为REMOTE HOOK是针对整个系统或其他进程的线程,因此HOOK必须封装成DLL,才可以植入到其他进程进行监控。而SYSTEM-WIDE LOCAL HOOK采用的是另外一种架构,系统中的线程请求或获得一个硬件消息的话,系统会调用那个安装有HOOK的线程,并执行它的FILTER FUNCTION.然后再返回给请求硬件消息的线程。这种架构有一个缺点就是如果HOOK FILTER FUNCTION的处理中进入无限循环的话,那么整个系统将停留再循环中,无法切换到其他线程。为了处理这个缺陷,WINDOW使用了一个办法来处理:就是CTRL+ESC键,如果用户按下CTRL+ESC键,则系统将会发送一个WM_CANCELJOUNAL消息到有挂上JOUNAL 系列HOOK的线程上面

先给不懂钩子的人简单介绍一下原理:所谓hook,既钩子。hook会在应用程序接到消息之前,拦截应用程序的信息,比如鼠标键盘钩子会拦截一个应用程序的鼠标键盘信息。要做盗号木马?用WH_KEYBOARD类型的hook

1.我们要跨进程使用钩子,要把hook函数写在DLL文件中,这是微软明确规定的。也有其他方法,这里不多叙述

2.在DLL文件中 设置钩子.

这里需要调用线程ID,threadId,我们会在下面调用DLL的调用端中写入

hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId)

//参数1:钩子类型

//参数2:钩子处理函数

//参数3:钩子所在的模块

//参数4:钩子要拦截的线程ID,如果要设置全局钩子,这里给0。

把这个SetWindowsHookEx()函数写在一个导出函数中,允许调用dll文件的程序调用

_declspec(dllexport) void SetHook(DWORD threadId)

{

hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId)

}

SetHook()就是本dll的导出函数

3.在钩子处理函数中写入功能,当钩子截取到WM_NULL消息的时候,注入DLL文件。由于WM_NULL消息,是个没用的消息,应用程序一般不会收到这个消息,除非我们自己发送一个这个消息,所以我们在注入DLL的时候,只要给要注入的应用程序发一个WM_NULL消息,当钩子截取到WM_NULL的时候就注入钩子,就可以了。

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

{

MSG* pMsg=(MSG*)lParam

if(WM_NULL==pMsg->message)

::LoadLibraryW(TEXT("D://MyDLL.dll"));

}

好了,编译DLL项目,产生DLL文件。

4.编写调用端,调用钩子

首先获取窗口句柄

HWND FindWindow( LPCTSTR lpClassName,

LPCTSTR lpWindowName

)

返回窗体句柄。hWnd.

hWnd=FindWindow(0,要注入dll的窗体的名称(例如:千千静听))

利用hWnd,查找窗体线程ID

threadId=GetWindowThreadProcessId(hWnd,0);

好了,我们有了线程ID了,可以调用钩子了。

SetHook(threadId)

这时钩子已经加载到目标线程中了。

向目标窗体发送WM_NULL消息

SendMessage(hWnd,WM_NULL,0,0)

钩子会在目标窗体受到消息前受到WM_NULL消息。由于钩子处理函数中做了判断,当受到WM_NULL消息时,加载DLL文件。所以DLL文件就注入到目标线程中了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/6040906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-12
下一篇 2023-03-12

发表评论

登录后才能评论

评论列表(0条)

保存