【记录】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
");// 或者使用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,只好两个都加上

原文地址:https://www.cnblogs.com/D3Hunter/p/3177236.html