Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用DLL注入记录内存分配函数_C_Linker_Dynamic Linking_Dll Injection - Fatal编程技术网

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