全局注入研究

  1. 前言
  2. 参考链接
  3. 用到的API函数
  4. 实验

前言

昨天和朋友聊的时候聊到全局注入,今天打算复现一下

参考链接

参考链接: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://422926799.github.io/posts/8bc59822.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录