【记录】Linux API钩子-文件打开
目标是想通过LD_PRELOAD替换所有文件打开操作,让目标程序调用我写的代码
linux上用C打开文件,常用的有以下几种方法:libc中的fopen、系统调用open等
刚开始猜想fopen底层应该是使用open实现的,这样的话,只要拦截掉open就可以了
加载时获取real_open就不写了,前面文章有
int open(const char *pathname, int flags) { printf("Invoking my open\n");// 或者使用GNU扩展 RTLD_NEXT也可以 return (*real_open)(pathname, flags); }
但实测时发现,这样只能拦截程序里对open的调用,不能拦截fopen,nm看了下libc库,发现里面有个叫open的弱符号,猜测fopen是调用其本地的open(如果fopen是使用open实现的话)
0000003ac68c57f0 W open 0000003ac68c5870 W open64
使用ltrace -S查看其调用过程,发现fopen没有使用open,与open(只是内核提供给用户空间的接口)类似直接使用内核函数实现
(感觉ltrace要比strace强大,既可以看系统调用,也可以看一些libc库的函数,其他库是否支持不太清楚,而且对内核的调用也可以显示出来)
fopen("aa", "r" <unfinished ...> SYS_brk(NULL) = 0xc316000 SYS_brk(0xc337000) = 0xc337000 SYS_open("aa", 0, 0666) = -2 <... fopen resumed> ) = 0 open("bb", 65, 07737 <unfinished ...> SYS_open("bb", 65, 07737) = 3 <... open resumed> ) = 3
由此可以确定,使用open不能拦截fopen,只好两个都加上