From f262004e1339f7265c3b669394c830b0bc20841b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Jun 2021 17:35:00 +0200 Subject: [PATCH] add patch.h for testing --- inc/patch.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 inc/patch.h diff --git a/inc/patch.h b/inc/patch.h new file mode 100644 index 0000000..b8716ef --- /dev/null +++ b/inc/patch.h @@ -0,0 +1,55 @@ +#ifndef PATCH_H +#define PATCH_H + +#define WIN32_LEAN_AND_MEAN +#include + +static inline PROC patch_call(char *src, char *dst) +{ + DWORD op = PAGE_EXECUTE_READ; + VirtualProtect(src, 5, PAGE_EXECUTE_READWRITE, &op); + src[0] = 0xE8; + DWORD org = *((DWORD *)(&src[1])); + *((DWORD *)(&src[1])) = dst - src - 5; + VirtualProtect(src, 5, op, &op); + return (PROC)(src + 5 + org); +} + +static inline void patch_ljmp(char *src, char *dst) +{ + DWORD op = PAGE_EXECUTE_READ; + VirtualProtect(src, 5, PAGE_EXECUTE_READWRITE, &op); + src[0] = 0xE9; + *((DWORD *)(&src[1])) = dst - src - 5; + VirtualProtect(src, 5, op, &op); +} + +static inline void patch_clear(char *start, char value, char *end) +{ + DWORD op = PAGE_EXECUTE_READ; + VirtualProtect(start, end - start, PAGE_EXECUTE_READWRITE, &op); + memset(start, value, end - start); + VirtualProtect(start, end - start, op, &op); +} + +static inline DWORD patch_setdword(DWORD *dst, DWORD value) +{ + DWORD op = PAGE_EXECUTE_READ; + VirtualProtect(dst, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &op); + DWORD org = *dst; + *dst = value; + VirtualProtect(dst, sizeof(DWORD), op, &op); + return org; +} + +static inline void patch_setbytes(char *dst, char *buf, size_t size) +{ + 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