Skip to content

Instantly share code, notes, and snippets.

@Erfan-Ahmadi
Created November 28, 2024 06:46
Show Gist options
  • Save Erfan-Ahmadi/93369b8b7fbce77b1adf8e244ea33849 to your computer and use it in GitHub Desktop.
Save Erfan-Ahmadi/93369b8b7fbce77b1adf8e244ea33849 to your computer and use it in GitHub Desktop.
malloc detour using minhook (CRT override)
#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