android - Android/Linux 上 libc C 函数调用的堆栈跟踪

标签 android c linux stack-trace libc

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

最佳答案

For example, I would like to inspect stacktrace for "open" libc call when it's called from my program (without modifying libc library).

有几个用例需要考虑:

  1. 从您的程序直接调用open
  2. 间接调用(例如,您调用 getgroups,这会打开 /etc/nsswitch.conf)
  3. 调用 open 根本不是由您的程序触发的(例如,动态加载程序打开 libc.so

你的问题表明你只对案例 1 感兴趣,这很容易解决:用 -Dopen=open_with_stacktrace 编译你想拦截 open 的代码,并链接到一个单独的文件:

// 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,您可以使用 function interposer通过 LD_PRELOAD

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

What I actually want is to implement security feature ...

你应该从那个开始。通常,您不能在程序本身中实现任何有意义的安全措施,您必须使用外部监视器。

您正在尝试检测是否有人插入了open。但是有人可以轻松地插入您的“检查器”功能,并使其始终返回“一切正常”的结果。

您应该考虑使用 sandboxing techniques 之一相反。

关于android - Android/Linux 上 libc C 函数调用的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46976911/

相关文章:

android - PorterDuff.Mode.MULTIPLY - Android 中这种颜色转换的意义

java - 致命异常 : main Error (Android Development)

c++ - C/C++ 中的指针帮助

linux - 自定义日志处理/解析

linux - 使用 Cocotron CDT 与 SDL 链接

java - Android 编程中的最终变量

android - 如何过滤与android room db的一对多关系

c - 使用幂进行计算

c - 使用 C (Linux) 验证网络接口(interface)是否存在

c - bash 使用什么来打开/执行 argv[0]?