C 使用DLL注入记录内存分配函数
我有一个简单的程序我们称之为受害者: 然后我按如下方式运行受害者:C 使用DLL注入记录内存分配函数,c,linker,dynamic-linking,dll-injection,C,Linker,Dynamic Linking,Dll Injection,我有一个简单的程序我们称之为受害者: 然后我按如下方式运行受害者: $ LD_LIBRARY_PATH=. LD_PRELOAD=libmemlog.so ./victim 0x55e0747792a0 它工作正常,但当我取消注释#如果0#endif在调用printf函数时阻塞,则我得到一个分段错误。这是因为printf在其内部调用malloc,我们得到了一个无休止的递归,最终将其粉碎 在这种情况下,如何进行日志记录工作?您是否尝试过在调试器中捕获崩溃(或启用崩溃后可以使用的核心文件生成)?可
$ LD_LIBRARY_PATH=. LD_PRELOAD=libmemlog.so ./victim
0x55e0747792a0
它工作正常,但当我取消注释#如果0#endif
在调用printf
函数时阻塞,则我得到一个分段错误。这是因为printf
在其内部调用malloc
,我们得到了一个无休止的递归,最终将其粉碎
在这种情况下,如何进行日志记录工作?您是否尝试过在调试器中捕获崩溃(或启用崩溃后可以使用的核心文件生成)?可能是
printf
(或附加到输出缓冲区时调用的函数之一)通过malloc
分配内存?如果您的main
函数在其malloc
调用之前调用printf
,会发生什么情况?@Someprogrammerdude,如果只在main
中调用printf
,它就会崩溃。是的,我试图在GDB中捕获崩溃,但我不是很擅长,所以我仍然在调试器中。@Someprogrammerdude,谢谢你的提示,我明白为什么我会得到segfault(我已经更新了问题)。所以这里还有另一个问题:如何进行日志工作?您需要编写自己的格式化函数,而不使用malloc。然后,您可以使用系统界面登录。(write
不使用内存分配库)。或者,您可以设置一个线程本地标志来指示这是一个递归调用,而不是在递归调用时打印。(这样就不会在printf中记录malloc调用)
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
void *
malloc(size_t n)
{
static void * (*real_malloc)(size_t) = NULL;
if (real_malloc == NULL) {
real_malloc = dlsym(RTLD_NEXT, "malloc");
if (real_malloc == NULL) {
#if 0
printf("MEMORY FILTER: can't find the real malloc() function: %s\n", dlerror());
#endif
exit(EXIT_FAILURE);
}
}
void *result = real_malloc(n);
#if 0
if (result != NULL)
printf("MEMORY FILTER: allocated %zu bytes at address %p.\n", n, result);
else
printf("MEMORY FILTER: failed to allocate %zu bytes.\n", n);
#endif
return result;
}
$ LD_LIBRARY_PATH=. LD_PRELOAD=libmemlog.so ./victim
0x55e0747792a0