zoukankan      html  css  js  c++  java
  • 【记录】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,只好两个都加上

  • 相关阅读:
    BZOJ1969: [Ahoi2005]LANE 航线规划
    BZOJ1800: [Ahoi2009]fly 飞行棋
    BZOJ2661: [BeiJing wc2012]连连看
    BZOJ2464: 中山市选[2009]小明的游戏
    BZOJ2440: [中山市选2011]完全平方数
    BZOJ2226: [Spoj 5971] LCMSum
    Codeforces 610B
    Codeforces 757B
    Codeforces B
    HDU 6090 Rikka with Graph
  • 原文地址:https://www.cnblogs.com/D3Hunter/p/3177236.html
Copyright © 2011-2022 走看看