#include <stdio.h> #include <Windows.h>
BYTE OldCode[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; BYTE HookCode[12] = { 0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0 };
void Hook(LPCWSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction) { DWORD_PTR FuncAddress = (UINT64)GetProcAddress(GetModuleHandle(lpModule), lpFuncName); DWORD OldProtect = 0;
if (VirtualProtect((LPVOID)FuncAddress, 12, PAGE_EXECUTE_READWRITE, &OldProtect)) { memcpy(OldCode, (LPVOID)FuncAddress, 12); *(PINT64)(HookCode + 2) = (UINT64)lpFunction; } memcpy((LPVOID)FuncAddress, &HookCode, sizeof(HookCode)); VirtualProtect((LPVOID)FuncAddress, 12, OldProtect, &OldProtect); }
void UnHook(LPCWSTR lpModule, LPCSTR lpFuncName) { DWORD OldProtect = 0; UINT64 FuncAddress = (UINT64)GetProcAddress(GetModuleHandle(lpModule), lpFuncName); if (VirtualProtect((LPVOID)FuncAddress, 12, PAGE_EXECUTE_READWRITE, &OldProtect)) { memcpy((LPVOID)FuncAddress, OldCode, sizeof(OldCode)); } VirtualProtect((LPVOID)FuncAddress, 12, OldProtect, &OldProtect); }
int WINAPI MyMessageBoxW(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) { UnHook(L"user32.dll", "MessageBoxW"); int ret = MessageBoxW(0, L"hello lyshark", lpCaption, uType);
Hook(L"user32.dll", "MessageBoxW", (PROC)MyMessageBoxW); return ret; }
bool APIENTRY DllMain(HANDLE handle, DWORD dword, LPVOID lpvoid) { switch (dword) { case DLL_PROCESS_ATTACH: Hook(L"user32.dll", "MessageBoxW", (PROC)MyMessageBoxW); break; case DLL_PROCESS_DETACH: UnHook(L"user32.dll", "MessageBoxW"); break; } return true; }
|