Created
November 28, 2024 06:46
-
-
Save Erfan-Ahmadi/93369b8b7fbce77b1adf8e244ea33849 to your computer and use it in GitHub Desktop.
malloc detour using minhook (CRT override)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "lib.h" | |
#include "../3rd/minhook/include/MinHook.h" | |
#include "../3rd/minhook/src/buffer.c" | |
#include "../3rd/minhook/src/hook.c" | |
#include "../3rd/minhook/src/trampoline.c" | |
#include "../3rd/minhook/src/hde/hde64.c" | |
typedef void* (*fn_malloc)(size_t size); | |
typedef void (*fn_free)(void* ptr); | |
typedef void* (*fn_realloc)(void* ptr, size_t size); | |
typedef void* (*fn_calloc)(size_t num, size_t size); | |
// These macros are copied from rmem: https://github.com/RudjiGames/rmem/blob/240defd1b0dba5c95dbc67414f72346a7b6bbda1/src/rmem_wrap_win.cpp#L290 | |
#define FN_ORIGINAL(name) \ | |
fn_##name fn_##name##_t; | |
#define CALL_ORIGINAL(name) \ | |
fn_##name##_t | |
#define GET_PROC_ADDRESS(hmodule, name) \ | |
( (fn_##name)(::GetProcAddress(hmodule, #name)) ) | |
#define CREATE_HOOK(hmodule, name) \ | |
MH_CreateHook((void*)GET_PROC_ADDRESS(hmodule, name), (void*)&detour_##name, (void **)&(CALL_ORIGINAL(name))); | |
#define REMOVE_HOOK(hmodule, name) \ | |
MH_RemoveHook((void*)GET_PROC_ADDRESS(hmodule, name)); | |
FN_ORIGINAL(malloc) | |
FN_ORIGINAL(free) | |
FN_ORIGINAL(realloc) | |
FN_ORIGINAL(calloc) | |
// Detour function for malloc | |
void* detour_malloc(size_t size) | |
{ | |
void* ret = (CALL_ORIGINAL(malloc)(size)); | |
// Custom Code | |
return ret; | |
} | |
// Detour function for free | |
void detour_free(void* ptr) | |
{ | |
// Custom Code | |
CALL_ORIGINAL(free)(ptr); | |
} | |
// Detour function for realloc | |
void* detour_realloc(void* ptr, size_t size) | |
{ | |
void* ret = CALL_ORIGINAL(realloc)(ptr, size); | |
// Custom Code | |
return ret; | |
} | |
// Detour function for calloc | |
void* detour_calloc(size_t num, size_t size) | |
{ | |
void* ret = CALL_ORIGINAL(calloc)(num, size); | |
// Custom Code | |
return ret; | |
} | |
namespace memory_profiling | |
{ | |
void hookAllocs() | |
{ | |
#if defined(_DEBUG) | |
HMODULE hUCRT = ::GetModuleHandleA("ucrtbased.dll"); | |
#else | |
HMODULE hUCRT = ::GetModuleHandleA("ucrtbase.dll"); | |
#endif | |
MH_Initialize(); | |
CREATE_HOOK(hUCRT, malloc); | |
CREATE_HOOK(hUCRT, free); | |
CREATE_HOOK(hUCRT, realloc); | |
CREATE_HOOK(hUCRT, calloc); | |
MH_EnableHook(MH_ALL_HOOKS); | |
} | |
void unhookAllocs() | |
{ | |
#if defined(_DEBUG) | |
HMODULE hUCRT = ::GetModuleHandleA("ucrtbased.dll"); | |
#else | |
HMODULE hUCRT = ::GetModuleHandleA("ucrtbase.dll"); | |
#endif | |
REMOVE_HOOK(hUCRT, malloc); | |
REMOVE_HOOK(hUCRT, free); | |
REMOVE_HOOK(hUCRT, realloc); | |
REMOVE_HOOK(hUCRT, calloc); | |
MH_Uninitialize(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment