通常,堆栈跟踪(backtraces)是从调用特殊堆栈跟踪生成函数的点生成的(如_Unwind_Backtrace here:Android NDK: getting the backtrace)。是否可以生成包含libc函数的stacktrace?例如,我想检查堆栈跟踪"打开"从我的程序调用时调用libc(不修改libc库)。我知道在Java中,可以调用一些抛出异常的方法,并从抛出异常的异常处理程序中获取堆栈跟踪。我想在C中做类似的事情,但我不认为这是可能的,因为在C中甚至没有例外。
答案 0 :(得分:1)
例如,我想从我的程序中调用stacktrace来检查“open”libc调用(不修改libc库)。
有几个用例需要考虑:
open
getgroups
,会打开/etc/nsswitch.conf
)open
来电(例如动态装载机开启libc.so
你的问题表明你只对案例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。