原理
钩子是WINDOWS中消息处理机制的一个要点,我们通过安装钩子,可以监视消息的传递,并能在消息到达目标窗口前提前进行处理
注意事项
1.目标进程需要存在消息循环机制
2.核心函数SetWindowsHookEx只能将32位DLL注入到32位进程,64位DLL注入到32位进程。不能将 32 位 DLL 注入到 64 位进程中,64 位 DLL 无法注入到 32 位进程中
步骤
1.首先就是创建需要的句柄:
一个钩子句柄
HHOOK g_Hook
一个用于注入的模块句柄
HMODULE hModule = LoadLibraryA(szPath);
还得给需要注入的目标程序拍个快照
HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessId);
2.初始化一些需要的变量和结构体:
获取注入函数的地址
DWORD dwFuncAddr = (DWORD)GetProcAddress(hModule, "rkdd");
初始化一个线程快照的结构体
THREADENTRY32 te32 = { sizeof(THREADENTRY32) };
3.然后开始检索快照
但凡找到一个进程ID和我们需要注入的进程的ID相同的快照,我们就通过SetWindowsHookEx函数进行挂钩
HHOOK SetWindowsHookExA(
[in] int idHook, //挂钩过程的类型
[in] HOOKPROC lpfn, //指向挂钩过程的指针
[in] HINSTANCE hmod, //需要注入的DLL的句柄
[in] DWORD dwThreadId //与挂钩过程关联的线程标识符
);
#include <stdio.h>
#include <Windows.h>
#include <TlHelp32.h>
BOOL Inject(DWORD dwProcessId, LPCSTR szPath)
{
HHOOK g_Hook;
HMODULE hModule = LoadLibraryA(szPath);
DWORD dwFuncAddr = (DWORD)GetProcAddress(hModule, "rkdd");
HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessId);
THREADENTRY32 te32 = { sizeof(THREADENTRY32) };
while (Thread32Next(hThreadSnap, &te32))
{
if (te32.th32OwnerProcessID == dwProcessId)
{
g_Hook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)dwFuncAddr, hModule, te32.th32ThreadID);
break;
}
}
return TRUE;
}
int main()
{
Inject(14956, "C:\\Users\\Allure_Love\\Desktop\\Dll1.dll");
system("pause");
return 0;
}
本文为极安御信对应课程的学习笔记