当前位置: 首页 > news >正文

3.4 DLL注入:全局消息钩子注入

SetWindowHookEx 是Windows系统的一个函数,可用于让一个应用程序安装全局钩子,但读者需要格外注意该方法安装的钩子会由操作系统注入到所有可执行进程内,虽然该注入方式可以用于绕过游戏保护实现注入,但由于其属于全局注入所以所有的进程都会受到影响,而如果想要解决这个问题,则需要在DllMain()也就是动态链接库开头位置进行判断,如果是我们所需操作的进程则执行该DLL模块内的功能,如果不是则自动跳过不执行任何操作即可实现指定进程的注入方式。

首先我们先来看一下该函数的原型定义;

HHOOK SetWindowsHookEx(int       idHook,HOOKPROC  lpfn,HINSTANCE hMod,DWORD     dwThreadId
);

参数说明如下:

  • idHook:钩子类型,标识了钩子函数要监视哪种事件。可以是整数值或预定义的常量值(如WH_MOUSE、WH_KEYBOARD、WH_SHELL等)。
  • lpfn:钩子函数的地址。
  • hMod:把钩子函数插入挂钩链中的应用程序的句柄,该参数通常被设置为包含钩子函数代码的DLL模块的句柄。
  • dwThreadId:要设置钩子的线程标识符或进程标识符,如果为 0,则钩子通常与所有线程的输入消息联系起来。

在安装全局消息钩子时,读者需要在DLL中对外暴漏两个接口,其中SetHook()用于设置钩子,UnHook()则用于取消钩子,在DLL入口处,通过调用GetFristModuleName()我们可以判断当前进程是否为我们所需操作的进程,如果是则执行进程内的流程,如果不是则跳过执行,这个流程可以描述为如下样子,读者可自行将如下代码编译为DLL文件。

#include <iostream>
#include <TlHelp32.h>
#include <windows.h>
#include <tchar.h>// 指定全局变量
HHOOK global_Hook;// 判断是否是需要注入的进程
BOOL GetFristModuleName(DWORD Pid, LPCTSTR ExeName)
{MODULEENTRY32 me32 = { 0 };me32.dwSize = sizeof(MODULEENTRY32);HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Pid);if (INVALID_HANDLE_VALUE != hModuleSnap){// 先拿到自身进程名称BOOL bRet = Module32First(hModuleSnap, &me32);// 对比如果是需要注入进程,则返回真if (!_tcsicmp(ExeName, (LPCTSTR)me32.szModule)){CloseHandle(hModuleSnap);return TRUE;}CloseHandle(hModuleSnap);return FALSE;}CloseHandle(hModuleSnap);return FALSE;
}// 获取自身DLL名称
char* GetMyDllName()
{char szFileFullPath[MAX_PATH], szProcessName[MAX_PATH];// 获取文件路径GetModuleFileNameA(NULL, szFileFullPath, MAX_PATH);int length = strlen(szFileFullPath);// 从路径后面开始找\,即倒着找右斜杠for (int i = length - 1; i >= 0; i--){// 找到第一个\就可以马上获取进程名称了if (szFileFullPath[i] == '\\'){i++;// 结束符\0不能少 即i=lengthfor (int j = 0; i <= length; j++){szProcessName[j] = szFileFullPath[i++];}break;}}return szProcessName;
}// 设置全局消息回调函数
LRESULT CALLBACK MyProc(int nCode, WPARAM wParam, LPARAM lParam)
{return CallNextHookEx(global_Hook, nCode, wParam, lParam);
}// 安装全局钩子 此处的 GetMyDllName()函数 可以是外部其他DLL,可将任意DLL进行注入
extern "C" __declspec(dllexport) void SetHook()
{global_Hook = SetWindowsHookEx(WH_CBT, MyProc, GetModuleHandleA(GetMyDllName()), 0);
}// 卸载全局钩子
extern "C" __declspec(dllexport) void UnHook()
{if (global_Hook){UnhookWindowsHookEx(global_Hook);}
}// DLL 主函数
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{// 当DLL被加载时触发,判断当前自身父进程是否为 lyshark.exe BOOL flag = GetFristModuleName(GetCurrentProcessId(), TEXT("lyshark.exe"));if (flag == TRUE){MessageBoxA(0, "hello lyshark", 0, 0);}break;}case DLL_THREAD_ATTACH:{break;}case DLL_THREAD_DETACH:{break;}case DLL_PROCESS_DETACH:{// DLL卸载时自动清理UnHook();break;}default:break;}return TRUE;
}

接着我们需要编写一个专门用来加载该DLL的程序,在调用DLL之前,我们需要通过LoadLibrary()将此模块加载到内存中,并通过GetProcAddress(hMod, "SetHook")获取到该模块的中SetHook函数的内存地址,最后直接调用SetHook()安装一个全局钩子,实现安装的代码流程如下所示;

#include <iostream>
#include <windows.h>int main(int argc, char* argv[])
{HMODULE hMod = LoadLibrary(TEXT("d://hook.dll"));// 挂钩typedef void(*pSetHook)(void);pSetHook SetHook = (pSetHook)GetProcAddress(hMod, "SetHook");SetHook();while (1){Sleep(1000);}// 卸载钩子typedef BOOL(*pUnSetHook)(HHOOK);pUnSetHook UnsetHook = (pUnSetHook)GetProcAddress(hMod, "UnHook");pUnSetHook();FreeLibrary(hMod);return 0;
}
http://www.xdnf.cn/news/853291.html

相关文章:

  • CSS3 经典教程系列:CSS3 圆角(border-radius)详解
  • 网卡参数设置建议与各个网卡参数含义详解
  • cortex-a8原理实践及应用
  • 获取IP地址
  • java开源的cms系统jsp cms系统
  • 第四章 数据字典详解
  • Discuz论坛设置论坛版块横排后,如何设置显示版块图标
  • nero刻录错误 序列号问题
  • 如何破解XP开机密码
  • Discuz!6.0 升级至 Discuz!7.2
  • C++在线五子棋对战(网页版)项目:实用工具类模块代码实现
  • 主流WebService框架
  • 2021年月薪多少,才能在北上广深“体面”生活?
  • android视频播放器排行榜,安卓视频播放器哪个好 五款主流视频播放器对比
  • iOS开发 swift 3dTouch实现 附代码
  • 黑马点评项目学习笔记(15w字详解,堪称史上最详细,欢迎收藏)
  • 解决 IE 选项卡重启的问题(此选项卡已经恢复)(ZT)
  • 对日软件外包
  • 谢国忠观点
  • Windows11系统提示找不到d3dx9_26.dll文件如何处理?
  • C++ Qt 学习(五):Qt Web 编程
  • Java 调用 WebService 服务的 3 种方式
  • MaxDOS v5.8s U盘版 / U盘版制作教程=(强力打造)
  • 【传奇服务器爱好者】-IGE引擎M2笔记-卧龙脚本
  • 传奇服务端Mirserver功能讲解
  • 毕业设计基于php玩酷(玩具)网站的设计与实现
  • coreplayer n79下载_coreplayer
  • 服务器lsass系统错误,电脑开机提示lsass.exe系统错误,安全帐户管理器初始化失败该怎么办?...
  • 广州华锐互动城市三维地图线上导航应用
  • new兼职网app v1.0.1