我不知道其他平臺,但在GNU/Linux上,您可以預先加載一個小內存跟蹤庫y與LD_PRELOAD
環境變量,其中定義了您自己的malloc
和free
。
你自己的malloc
可能想要使用真實的malloc
函數分配內存,所以這裏有一個可能的遞歸問題。要解決此問題,dlsym函數可以使用RTLD_NEXT
參數來獲取指向下一個(即「真實」)函數的指針。
一個非常小的這個測試可能看起來如下:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
void *malloc(size_t size)
{
static void *(*real_malloc)(size_t size) = 0;
if (!real_malloc)
real_malloc = dlsym(RTLD_NEXT, "malloc");
void *result = real_malloc(size);
fprintf(stderr, "malloc(%d) = %p\n", (int)size, result);
return result;
}
void free(void *ptr)
{
static void (*real_free)(void *ptr) = 0;
if (!real_free)
real_free = dlsym(RTLD_NEXT, "free");
real_free(ptr);
fprintf(stderr, "free(%p)\n", ptr);
}
如果我們把這個文件fakemalloc.c
,它可以被編譯成一個fakemalloc.so
共享對象與命令
gcc -fPIC -shared -Wl,-soname,fakemalloc.so -o fakemalloc.so fakemalloc.c -ldl
由於一個測試,看看哪個malloc
和free
調用發生在ls
命令的調用中,您需要執行
LD_PRELOAD=/path/to/fakemalloc.so ls
編輯:正如在評論中提到,在glibc的系統,你可以通過使用功能__libc_malloc
和__libc_free
避免RTLD_NEXT
方法。這將產生以下代碼:
來源
2016-12-25 16:00:50
brm
@Lolrapa這裏的問題是注入的函數必須有一個名稱爲'malloc',但在注入的函數內有一個調用到系統「malloc」,這可能會產生一個無限遞歸函數?! –