1

我试图覆盖某个进程的所有文件相关函数,作为预加载库,我将这段代码编译为预加载库,然后我只运行该进程并查看标准输出:

    #include <stdio.h>
    #include <dlfcn.h>
    FILE *(*original_fopen)(const char*, const char*) = NULL;

    FILE *fopen(const char *path, const char *mode) {
        printf("In our own fopen, opening %s\n", path);
        fflush(stdout);

        if (!original_fopen) {
            original_fopen = (FILE * (*)(const char*, const char*))dlsym(RTLD_NEXT, "fopen");
        }
        return (*original_fopen)(path, mode);

}

这可以编译g++ -Wall -fPIC -shared -o hooks.so hooks.cpp -ldl

然后只需使用任何使用 fifos 的程序:

LD_PRELOAD=hooks.so ./prog

问题是,该程序似乎出于某种原因使用了 libio/iofopen.c 中的函数 _IO_new_fopen,所以: 1. 有没有办法强制它使用 fopen?最初是如何使用这个功能的?或 2. 我可以覆盖它吗?我尝试了相同的签名,但它没有工作..

更新:从调用回调的应用程序的某些地方所以我确信这是一些包含,并且必须有一种方法来覆盖它.. 但是如何?

4

0 回答 0