拦截所有二进制文件的打开系统调用

时间:2016-09-26 06:16:44

标签: linux gcc ld-preload

我看到拦截fopen LD_PRELOAD并非100%有效(下面的演示)。有没有一种方法可以拦截开放的系统调用?
我的最终目标是提供与请求文件不同的文件(例如,在请求/etc/hosts时,将流返回/tmp/my-hosts)。
宁愿不必使用root,但如果必须的话,那就这样吧。

编辑:我想要一个适用于现有二进制文件的解决方案。我无法访问他们的来源。

bin.c

#include <stdio.h>

int main() {
  int c;
  FILE *file;
  file = fopen("file", "r");
  if (file) {
      while ((c = getc(file)) != EOF)
          putchar(c);
      fclose(file);
  } 
}

override.c

#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 %)$ 

1 个答案:

答案 0 :(得分:0)

结帐kprobes或系统点击以拦截系统调用。