1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <windows.h> #include <iostream>
typedef int (WINAPI* MessageBoxW_t)(HWND, LPCWSTR, LPCWSTR, UINT); MessageBoxW_t TrueMessageBoxW = MessageBoxW;
BYTE originalBytes[5];
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) { std::wcout << L"[Inline Hook] MessageBoxW hooked!" << std::endl;
DWORD oldProtect; VirtualProtect((LPVOID)TrueMessageBoxW, 5, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((LPVOID)TrueMessageBoxW, originalBytes, 5); VirtualProtect((LPVOID)TrueMessageBoxW, 5, oldProtect, &oldProtect);
int ret = TrueMessageBoxW(hWnd, lpText, lpCaption, uType);
VirtualProtect((LPVOID)TrueMessageBoxW, 5, PAGE_EXECUTE_READWRITE, &oldProtect); DWORD relativeAddr = (DWORD)MyMessageBoxW - (DWORD)TrueMessageBoxW - 5; *(BYTE*)TrueMessageBoxW = 0xE9; *(DWORD*)((BYTE*)TrueMessageBoxW + 1) = relativeAddr; VirtualProtect((LPVOID)TrueMessageBoxW, 5, oldProtect, &oldProtect);
return ret; }
void InstallInlineHook() { DWORD oldProtect; VirtualProtect((LPVOID)TrueMessageBoxW, 5, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy(originalBytes, (LPVOID)TrueMessageBoxW, 5);
DWORD relativeAddr = (DWORD)MyMessageBoxW - (DWORD)TrueMessageBoxW - 5; *(BYTE*)TrueMessageBoxW = 0xE9; *(DWORD*)((BYTE*)TrueMessageBoxW + 1) = relativeAddr;
VirtualProtect((LPVOID)TrueMessageBoxW, 5, oldProtect, &oldProtect); }
int main() { InstallInlineHook(); MessageBoxW(NULL, L"Hello", L"Inline Hook Demo", MB_OK); return 0; }
|