void install_hook()
{
HINSTANCE hinstLib;
VOID *proxy_address;
DWORD *relative_offset;
DWORD *hook_address;
DWORD src;
DWORD dst;
CHAR patch[5]= {0};
char saved_buffer[5];
FARPROC function_address= NULL;
hinstLib= LoadLibraryA(TEXT("user32.dll"));
function_address= GetProcAddress(hinstLib, "MessageBoxA");
ReadProcessMemory(GetCurrentProcess(), function_address, saved_buffer, 5, NULL);
proxy_address= &proxy_function;
src= (DWORD)function_address + 5;
dst= (DWORD)proxy_address;
relative_offset= (DWORD *)(dst-src);
memcpy(patch, "\xE9", 1);
memcpy(patch + 1, &relative_offset, 4);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)function_address, patch, 5, NULL);
trampoline_address= VirtualAlloc(NULL, 11, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
hook_address= (DWORD *)((DWORD)function_address + 5);
memcpy((BYTE *)trampoline_address, &saved_buffer, 5);
memcpy((BYTE *)trampoline_address + 5, "\x68", 1);
memcpy((BYTE *)trampoline_address + 6, &hook_address, 4);
memcpy((BYTE *)trampoline_address + 10, "\xC3", 1);
}