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,只好两个都加上

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/D3Hunter/p/3177236.html
Copyright © 2011-2022 走看看