全局注入研究
前言
昨天和朋友聊的时候聊到全局注入,今天打算复现一下
参考链接
参考链接:https://www.cnblogs.com/DarkBright/p/10835761.html
用到的API函数
GetMsgProc
GetMsgProc与SetWindowsHookEx函数一起使用的应用程序定义或库定义的回调函数。每当GetMessage或PeekMessage函数从应用程序消息队列中检索消息时,系统就会调用此函数。在将检索到的消息返回给调用者之前,系统会将消息传递给挂钩过程。
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644981(v=vs.85)
SetWindowsHookExA
将应用程序定义的挂钩过程安装到挂钩链中。您将安装一个挂钩过程来监视系统中的某些类型的事件。这些事件与特定线程或与调用线程在同一桌面上的所有线程相关联。
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexa
UnhookWindowsHookEx
删除通过SetWindowsHookEx函数安装在挂钩链中的挂钩过程。
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-unhookwindowshookex
实验
整体思路:
1. 声明钩子返回的函数即为GetMsgProc
2. 设置钩子要钩住的的事件类型
3. 定义要执行的函数
4. DLLMain载入DLL的时候定义要执行的code
5. 调用dll的LoadHook函数钩住
6. 然后dll的HookLoad函数
7. 由于载入DLL的时候会先执行DLLMain,所以当前进程会执行DLLMain然后在调用钩子钩住对应的类型,然后在注入dll
8. 根据需求卸载钩子
test.dll
导出的函数
* LoadHook
* UnloadHook
#include "stdafx.h"
#include <Windows.h>
HHOOK g_hook;
HMODULE g_module;
extern "C" {
__declspec(dllexport) BOOL LoadHook();
}
extern "C" {
__declspec(dllexport) VOID UnloadHook();
}
LRESULT CALLBACK GetMsgProc(
_In_ int code,
_In_ WPARAM wParam,
_In_ LPARAM lParam
) {
return CallNextHookEx(g_hook, code, wParam, lParam);
}
BOOL LoadHook(void) {
g_hook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, g_module, 0);
if (g_hook) {
MessageBoxA(NULL, "Sucess", 0, MB_OK);
return TRUE;
}
else {
return FALSE;
}
}
VOID UnloadHook(void) {
if (g_hook) {
UnhookWindowsHookEx(g_hook);
}
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_module = hModule;
MessageBox(NULL, TEXT("加载DLL!"), TEXT("提示"), MB_OK);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
inject.exe
#include "stdafx.h"
#include <Windows.h>
#define DLL_NAME "test.dll"
#define error(name){printf("Error:%s code:%d",name,GetLastError());}
int main() {
do {
HMODULE hModule = LoadLibraryA(DLL_NAME);
if (hModule == NULL) {
error("LoadLibraryA");
break;
}
FARPROC pfnLoadHook = GetProcAddress(hModule,"LoadHook");
FARPROC pfnUnLoadHook = GetProcAddress(hModule, "UnloadHook");
if (pfnLoadHook == NULL || pfnUnLoadHook == NULL) {
error("GetProcAddress");
break;
}
if (pfnLoadHook()) {
printf("global inject sucess!");
}else {
printf("global inject failure");
break;
}
printf("Enter UnloadHook");
getchar();
pfnUnLoadHook();
} while (FALSE);
getchar();
return 0;
}
在当前权限所允许的情况下,会多所有能访问的进程钩住注入dll
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:全局注入研究
本文作者:九世
发布时间:2020-12-27, 14:33:16
最后更新:2020-12-27, 14:50:35
原始链接:http://jiushill.github.io/posts/8bc59822.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。