我看到拦截fopen
LD_PRELOAD
并非100%有效(下面的演示)。有没有一种方法可以拦截开放的系统调用?
我的最终目标是提供与请求文件不同的文件(例如,在请求/etc/hosts
时,将流返回/tmp/my-hosts
)。
宁愿不必使用root,但如果必须的话,那就这样吧。
#include <stdio.h>
int main() {
int c;
FILE *file;
file = fopen("file", "r");
if (file) {
while ((c = getc(file)) != EOF)
putchar(c);
fclose(file);
}
}
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
FILE *fopen(const char *path, const char *mode) {
printf("INTERCEPTED\n");
FILE *(*original_fopen)(const char*, const char*);
original_fopen = dlsym(RTLD_NEXT, "fopen");
return (*original_fopen)(path, mode);
}
FILE *fopen64(const char *path, const char *mode) {
printf("INTERCEPTED64\n");
FILE *(*original_fopen64)(const char*, const char*);
original_fopen64 = dlsym(RTLD_NEXT, "fopen");
return (*original_fopen64)(path, mode);
}
clean:
rm -f bin-stat bin-dyn override.so
bin-stat: bin.c
gcc -static -Wall -Werror -o bin-stat bin.c
bin-dyn: bin.c
gcc -Wall -Werror -o bin-dyn bin.c
override.so: override.c
gcc -Wall -fPIC -shared -o override.so override.c -ldl
test: clean bin-stat bin-dyn override.so
LD_PRELOAD=./override.so ./bin-dyn
LD_PRELOAD=./override.so ./bin-stat
正如您所看到的,编译bin-stat
时没有动态链接到libc,正如您所猜测的那样,LD_PRELOAD
无法工作:
nitz@mars:~/Desktop/test-ld (master %)$ make test
rm -f bin-stat bin-dyn override.so
gcc -static -Wall -Werror -o bin-stat bin.c
gcc -Wall -Werror -o bin-dyn bin.c
gcc -Wall -fPIC -shared -o override.so override.c -ldl
LD_PRELOAD=./override.so ./bin-dyn
INTERCEPTED
is file
LD_PRELOAD=./override.so ./bin-stat
is file
nitz@mars:~/Desktop/test-ld (master %)$
答案 0 :(得分:0)
结帐kprobes或系统点击以拦截系统调用。