我正在写一个工具。该工具的一部分是能够记录系统调用的参数。好吧,我可以为此目的使用 ptrace
,但是 ptrace
非常慢。我想到的一个更快的方法是修改 glibc。但这变得越来越困难,因为 gcc 神奇地插入了自己的内置函数作为系统调用包装器,而不是使用 glibc 中定义的代码。使用 -fno-builtin
也无济于事。
所以我想到了编写一个共享库的想法,其中包括每个系统调用包装器,例如mmap
,然后在调用实际的系统调用包装器函数之前执行日志记录。例如,下面给出了我的 mmap
的伪代码。
int mmap(...)
{
log_parameters(...);
call_original_mmap(...);
...
}
然后我可以使用 LD_PRELOAD 首先加载这个库。您认为这个想法行得通吗,还是我遗漏了什么?
最佳答案
您在用户空间中想出的任何方法都无法与任何应用程序无缝协作。对你来说幸运的是,已经支持在内核中做你想做的事情。 Kprobes 和 Kretprobes 允许您检查机器在系统调用之前和之后的状态。
关于c - 这是拦截系统调用的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688707/