原理
钩子是WINDOWS中消息处理机制的一个要点,我们通过安装钩子,可以监视消息的传递,并能在消息到达目标窗口前提前进行处理
注意事项
1.目标进程需要存在消息循环机制
2.核心函数SetWindowsHookEx只能将32位DLL注入到32位进程,64位DLL注入到32位进程。不能将 32 位 DLL 注入到 64 位进程中,64 位 DLL 无法注入到 32 位进程中
步骤
HHOOK g_Hook
讯享网
一个用于注入的模块句柄
讯享网HMODULE hModule = LoadLibraryA(szPath);
还得给需要注入的目标程序拍个快照
HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessId);
讯享网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; }
本文为极安御信对应课程的学习笔记

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/68818.html