自学内容网 自学内容网

用户层 Inline Hook

x86两种方式

jmp

杀软常直接通过 jmp 来进行 hook,占 5 字节,但是需要进行计算,例:

mov、jmp

不需要计算,但是占 7 字节,例:

x64

不能直接jmp,要用mov、jmp,占 12 字节

DLL注入hook

hook MessageBox 进入 MyMessageBox,例:

被注入的MessageBox.exe:

dllmain.cpp

#include "pch.h"
#include <windows.h>

#ifndef _WIN64 // x86.dll
BYTE OldCode[7] = { 0 };
BYTE NewCode[7] = { 0xB8, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE0 };
#else // x64.dll
BYTE OldCode[12] = { 0 };
BYTE NewCode[12] = { 0x48, 0xB8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE0 };
#endif*/

HMODULE hModule_User32 = GetModuleHandle(L"user32.dll"); // 加载user32.dll
FARPROC MessageBoxAddress = GetProcAddress(hModule_User32, "MessageBoxW"); // 获取MessageBoxW地址,Unicode用W、Ascii用A

int WINAPI MyMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) { // 使用Windows API的调用约定(__stdcall)
#ifndef _WIN64 // x86.dll
    RtlCopyMemory(MessageBoxAddress, OldCode, 7); // 改回原硬编码
    MessageBox(0, L"2", L"2", MB_OK); // 修改弹框内容
    RtlCopyMemory(MessageBoxAddress, NewCode, 7); // 改为新硬编码,用于下一次hook
#else // x64.dll
    RtlCopyMemory(MessageBoxAddress, OldCode, 12);
    MessageBox(0, L"2", L"2", MB_OK);
    RtlCopyMemory(MessageBoxAddress, NewCode, 12);
#endif
    return 0;
}

void InlineHook() { // 进行hook
#ifndef _WIN64 // x86.dll
    RtlCopyMemory(OldCode, MessageBoxAddress, 7); // 获取原前7字节硬编码

    DWORD jmpAddress = (DWORD)MyMessageBox; // 获取MyMessageBox地址
    memcpy(&NewCode[1], &jmpAddress, 4); // 将MyMessageBox地址补充到新硬编码
    DWORD oldProtection = NULL; // 用于接收修改前的访问权限
    VirtualProtect(MessageBoxAddress, 7, PAGE_EXECUTE_READWRITE, &oldProtection); // MessageBox前 7 字节改为可对可写可执行
    RtlCopyMemory(MessageBoxAddress, NewCode, 7); // 将前7字节硬编码改为新硬编码
#else // x64.dll
    RtlCopyMemory(OldCode, MessageBoxAddress, 12);

    ULONGLONG jmpAddress = (ULONGLONG)MyMessageBox;
    memcpy(&NewCode[2], &jmpAddress, 8);
    DWORD oldProtection = NULL;
    VirtualProtect(MessageBoxAddress, 12, PAGE_EXECUTE_READWRITE, &oldProtection);
    RtlCopyMemory(MessageBoxAddress, NewCode, 12);
#endif
}

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        InlineHook();
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


原文地址:https://blog.csdn.net/2301_80520893/article/details/137588083

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!