用户层 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)!