玩转消息钩子HOOK技术

admin 2021年12月22日01:57:31评论163 views字数 2917阅读9分43秒阅读模式

玩转消息钩子HOOK技术

扫一扫关注公众号,长期致力于安全研究玩转消息钩子HOOK技术

前言:本文简单详解消息HOOK技术



0x01 键盘消息钩子

Hookdll.dll是一个含有钩子的DLL文件,HOOKnot.exe是最先加载该DLL的程序,当HOOKnot.exe加载该DLL文件后,使用SetWindowsHookEx()安装钩子,若其他进程发生消息事件,就会将该DLL文件强制加载到相应内存

玩转消息钩子HOOK技术


0x02 代码编写

分析:SetWindowsHookEx(WH_MOUSE, KeyProc, g_hinstance, 0);

该函数第一个参数详解

WH_CALLWNDPROC(4): 安装一个挂钩处理过程,在系统将消息发送至目标窗口处理过程之前,对该消息进行监视,详情参见CallWndProc挂钩处理过程.
WH_CALLWNDPROCRET(12) :安装一个挂钩处理过程,它对已被目标窗口处理过程处理过了的消息进行监视,详情参见 CallWndRetProc 挂钩处理过程.
WH_CBT(5) :安装一个挂钩处理过程,接受对CBT应用程序有用的消息 ,详情参见 CBTProc 挂钩处理过程.
WH_DEBUG(9):安装一个挂钩处理过程以便对其他挂钩处理过程进行调试, 详情参见DebugProc挂钩处理过程.
WH_FOREGROUNDIDLE(11):安装一个挂钩处理过程,该挂钩处理过程当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务.
WH_GETMESSAGE(3):安装一个挂钩处理过程对寄送至消息队列的消息进行监视,详情参见 GetMsgProc 挂钩处理过程.
WH_JOURNALPLAYBACK(1):安装一个挂钩处理过程,对此前由WH_JOURNALRECORD 挂钩处理过程纪录的消息进行寄送.详情参见 JournalPlaybackProc挂钩处理过程.
WH_JOURNALRECORD(0):安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRecordProc挂钩处理过程.
WH_KEYBOARD(2):安装一个挂钩处理过程对击键消息进行监视. 详情参见KeyboardProc挂钩处理过程.
WH_KEYBOARD_LL(13):此挂钩只能在Windows NT中被安装,用来对底层的键盘输入事件进行监视.详情参见LowLevelKeyboardProc挂钩处理过程.
WH_MOUSE(7):安装一个挂钩处理过程,对鼠标消息进行监视. 详情参见 MouseProc挂钩处理过程.
WH_MOUSE_LL(14):此挂钩只能在Windows NT中被安装,用来对底层的鼠标输入事件进行监视.详情参见LowLevelMouseProc挂钩处理过程.
WH_MSGFILTER(-1):安装一个挂钩处理过程, 以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.详情参见MessageProc挂钩处理过程.
WH_SHELL(10):安装一个挂钩处理过程以接受对外壳应用程序有用的通知, 详情参见 ShellProc挂钩处理过程.
WH_SYSMSGFILTER(6):安装一个挂钩处理过程,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.这个挂钩处理过程对系统中所有应用程序的这类消息都进行监视.详情参见 SysMsgProc挂钩处理过程.

HOOKnot.exe 该代码很简单,自己分析即可

#include "stdafx.h"#include <windows.h>#include <iostream>#include <string.h>#include <conio.h>using namespace std;typedef void(*HOOKSTART)();typedef void(*HOOKSTOP)();int _tmain(int argc, _TCHAR* argv[]){
HMODULE hdll = NULL;
hdll = LoadLibraryA("Hookdll.dll"); if (hdll){ cout << "Dll loading..." << endl; } //获取导出地址 HOOKSTART hookstart = (HOOKSTART)GetProcAddress(hdll, "HOOKSTART"); HOOKSTOP hookstop= (HOOKSTOP)GetProcAddress(hdll, "HOOKSTOP");
hookstart();//开始hook cout << "输入q退出" << endl; while (_getch() != 'q'); hookstop();//终止hook return 0;}
    HOOKdll.dll  当HOOKSTART就设置一个钩子,执行完之后卸载
#include "stdafx.h"#include <string.h>#include <stdio.h>#define PROCESS_NAME "notepad.exe"HHOOK ghook;HINSTANCE g_hinstance = NULL;BOOL APIENTRY DllMain( HINSTANCE hModule,                       DWORD  ul_reason_for_call,                       LPVOID lpReserved           ){  switch (ul_reason_for_call)  {  case DLL_PROCESS_ATTACH:    g_hinstance = hModule;    break;  case DLL_THREAD_ATTACH:  case DLL_THREAD_DETACH:  case DLL_PROCESS_DETACH:    break;  }  return TRUE;}LRESULT CALLBACK KeyProc(int code,WPARAM wParam,LPARAM lParam){  TCHAR szPath[MAX_PATH] = { 0 };  if (code >= 0){
MessageBox(NULL, L"HOOK", L"程序开始HOOK", NULL);    } return CallNextHookEx(ghook, code, wParam, lParam);}
#ifdef __cplusplusextern "C"{#endif __declspec(dllexport) void HOOKSTART(){ MessageBox(NULL, L"HOOKSTART", L"HOOKSTARTHOOK", NULL); ghook = SetWindowsHookEx(WH_MOUSE, KeyProc, g_hinstance, 0); } __declspec(dllexport) void HOOKSTOP(){ MessageBox(NULL, L"HOOKSTOP", L"HOOKSTOP", NULL); if (ghook){ UnhookWindowsHookEx(ghook);//卸载钩子 ghook = NULL; } }#ifdef __cplusplus}#endif

0x03 实现效果

成功HOOK

玩转消息钩子HOOK技术




11111
微信搜索关注 "安全族" 长期致力于安全研究


下方扫一下扫,即可关注玩转消息钩子HOOK技术

玩转消息钩子HOOK技术






本文始发于微信公众号(安全族):玩转消息钩子HOOK技术

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月22日01:57:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   玩转消息钩子HOOK技术https://cn-sec.com/archives/467461.html

发表评论

匿名网友 填写信息