2021-06-01 17:35:00 +02:00
|
|
|
#ifndef PATCH_H
|
|
|
|
#define PATCH_H
|
|
|
|
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
|
|
#include <windows.h>
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
static inline PROC patch_call(char* src, char* dst)
|
2021-06-01 17:35:00 +02:00
|
|
|
{
|
|
|
|
DWORD op = PAGE_EXECUTE_READ;
|
|
|
|
VirtualProtect(src, 5, PAGE_EXECUTE_READWRITE, &op);
|
|
|
|
src[0] = 0xE8;
|
2021-06-11 20:30:43 +02:00
|
|
|
DWORD org = *((DWORD*)(&src[1]));
|
|
|
|
*((DWORD*)(&src[1])) = dst - src - 5;
|
2021-06-01 17:35:00 +02:00
|
|
|
VirtualProtect(src, 5, op, &op);
|
|
|
|
return (PROC)(src + 5 + org);
|
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
static inline void patch_ljmp(char* src, char* dst)
|
2021-06-01 17:35:00 +02:00
|
|
|
{
|
|
|
|
DWORD op = PAGE_EXECUTE_READ;
|
|
|
|
VirtualProtect(src, 5, PAGE_EXECUTE_READWRITE, &op);
|
|
|
|
src[0] = 0xE9;
|
2021-06-11 20:30:43 +02:00
|
|
|
*((DWORD*)(&src[1])) = dst - src - 5;
|
2021-06-01 17:35:00 +02:00
|
|
|
VirtualProtect(src, 5, op, &op);
|
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
static inline void patch_clear(char* start, char value, char* end)
|
2021-06-01 17:35:00 +02:00
|
|
|
{
|
|
|
|
DWORD op = PAGE_EXECUTE_READ;
|
|
|
|
VirtualProtect(start, end - start, PAGE_EXECUTE_READWRITE, &op);
|
|
|
|
memset(start, value, end - start);
|
|
|
|
VirtualProtect(start, end - start, op, &op);
|
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
static inline DWORD patch_setdword(DWORD* dst, DWORD value)
|
2021-06-01 17:35:00 +02:00
|
|
|
{
|
|
|
|
DWORD op = PAGE_EXECUTE_READ;
|
|
|
|
VirtualProtect(dst, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &op);
|
|
|
|
DWORD org = *dst;
|
2021-06-11 20:30:43 +02:00
|
|
|
*dst = value;
|
2021-06-01 17:35:00 +02:00
|
|
|
VirtualProtect(dst, sizeof(DWORD), op, &op);
|
|
|
|
return org;
|
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
static inline void patch_setbytes(char* dst, char* buf, size_t size)
|
2021-06-01 17:35:00 +02:00
|
|
|
{
|
|
|
|
DWORD op = PAGE_EXECUTE_READ;
|
|
|
|
VirtualProtect(dst, size, PAGE_EXECUTE_READWRITE, &op);
|
|
|
|
memcpy(dst, buf, size);
|
|
|
|
VirtualProtect(dst, size, op, &op);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define PATCH_SET(a,b) patch_setbytes(a,b,sizeof(b)-1)
|
|
|
|
|
|
|
|
#endif
|