用于在Android / Linux上进行libc C函数调用的Stacktrace

时间:2017-10-27 14:03:07

标签: android c linux stack-trace libc

通常,堆栈跟踪(backtraces)是从调用特殊堆栈跟踪生成函数的点生成的(如_Unwind_Backtrace here:Android NDK: getting the backtrace)。是否可以生成包含libc函数的stacktrace?例如,我想检查堆栈跟踪"打开"从我的程序调用时调用libc(不修改libc库)。我知道在Java中,可以调用一些抛出异常的方法,并从抛出异常的异常处理程序中获取堆栈跟踪。我想在C中做类似的事情,但我不认为这是可能的,因为在C中甚至没有例外。

1 个答案:

答案 0 :(得分:1)

  

例如,我想从我的程序中调用stacktrace来检查“open”libc调用(不修改libc库)。

有几个用例需要考虑:

  1. 从您的计划直接致电open
  2. 间接通话(例如,您致电getgroups,会打开/etc/nsswitch.conf
  3. 根本不是您的程序触发的open来电(例如动态装载机开启libc.so
  4. 你的问题表明你只对案例1感兴趣,这个案件很容易解决:编译你想用open拦截-Dopen=open_with_stacktrace的代码,并链接到一个单独的文件:< / p>

    // Compile without -Dopen=...
    #include <stdlib.>
    ssize_t open_with_stacktrace(const char *fname, int flags, int mode)
    {
      // Do whatever to record the stack trace.
      return open(fname, flags, mode);
    }
    

    对于案例2,您可以通过LD_PRELOAD使用function interposer

    对于案例3,您必须使用外部跟踪器,例如GDB。

      

    我真正想要的是实现安全功能......

    你应该从那开始。通常,无法在程序本身中实现任何有意义的安全性, 使用外部监视器。

    您正试图检测某人是否插入open。但有人可以轻松插入你的“检查”功能,并让它始终返回“一切都很好”的结果。

    您应该考虑使用其中一个sandboxing techniques