通常,堆栈跟踪(回溯)是从调用特殊堆栈跟踪生成函数的点生成的(如此处的 _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).
有几个用例需要考虑:
- 从您的程序直接调用
open
- 间接调用(例如,您调用
getgroups
,这会打开/etc/nsswitch.conf
) - 调用
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/