rendered paste body#include <windows.h>
#pragma pack(push, 1)
typedef struct _jump
{
BYTE jmp;
DWORD address;
} JUMP;
#pragma pack(pop)
typedef struct _prolog
{
BYTE bytes[16];
} PROLOG;
/* B8 2B 12 00 00 mov eax, 122Bh */
/* FF E0 jmp eax */
BOOL hookfunc(HMODULE mod, const char *func, void *hook, BYTE *copybuf, DWORD checkbytes, DWORD copybytes)
{
void *p;
JUMP *j;
DWORD prot;
DWORD i;
p = GetProcAddress(user32,func);
if (!p || !VirtualProtect(p,copybytes + sizeof(JUMP),PAGE_EXECUTE_READWRITE,&prot))
return FALSE;
if (copybuf)
{
for (i = 0;i < checkbytes;i++)
{
if (copybuf[i] && copybuf[i] != ((BYTE *)p)[i]) return FALSE;
}
if (copybytes)
{
CopyMemory(copybuf,p,copybytes);
j = (JUMP *)©buf[copybytes];
j->jmp = 0xE9;
j->address = (DWORD)p + copybytes - (DWORD)©buf[copybytes] - (DWORD)sizeof(JUMP);
}
}
j = p;
j->jmp = 0xE9;
j->address = (DWORD)hook - (DWORD)p - (DWORD)sizeof(JUMP);
VirtualProtect(p,copybytes + sizeof(JUMP),prot,&prot);
return TRUE;
}