我试图覆盖某个进程的所有文件相关函数,作为预加载库,我将这段代码编译为预加载库,然后我只运行该进程并查看标准输出:
#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. 我可以覆盖它吗?我尝试了相同的签名,但它没有工作..
更新:从调用回调的应用程序的某些地方,所以我确信这是一些包含,并且必须有一种方法来覆盖它.. 但是如何?