消息钩子注入原理是利用Windows
系统中SetWindowsHookEx()
这个API
,可以拦截目标进程的消息到指定的DLL
中导出的函数,利用这个特性,就可以将DLL
注入到指定进程中。
CHHOOK SetWindowsHookExA( [in] int idHook, [in] HOOKPROC lpfn, [in] HINSTANCE hmod, [in] DWORD dwThreadId );
基本原理就是,SetWindowsHookEx
调用的函数如果目标里没有,那么它就会强行加载第三个参数中的模块句柄,就完成注入。
准备:
先创建个动态连接库,然后添加个头文件导出函数,并创建写好弹窗代码,其他什么都不用动。
c# include <stdio.h> # include <Windows.h> # include <TlHelp32.h> //dwPid :进程ID //lpDllPath :动态链接库的路径 BOOL Inject(DWORD dwPid, LPCSTR lpDllPath) { HHOOK g_Hook; HMODULE hModule = LoadLibraryA(lpDllPath); if (!hModule) { return FALSE; } DWORD dwFuncAddress = (DWORD)GetProcAddress(hModule, "Na1r"); HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwPid); THREADENTRY32 te32 = { sizeof(THREADENTRY32) }; BOOL bRet = Thread32First(hSnap, &te32); if (bRet) { do { if (te32.th32OwnerProcessID == dwPid) { g_Hook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)dwFuncAddress, hModule, te32.th32ThreadID); break; } } while (Thread32Next(hSnap, &te32)); } return TRUE; } int main() { Inject(89924, "F:\\work\\TestDll.dll"); return 0; }
本文作者:Na1r
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!