我包装了一些系统调用函数,如write()、open()等,LD-PRELOAD用于覆盖原始系统调用。此外,我还定义了一些更多的函数,并使其也成为一个shred库。
我希望在这些共享库进入共享库之前,捕获来自不同应用程序进程的所有系统调用。我该怎么做呢?
谢谢
发布于 2011-06-05 02:12:02
LD_PRELOAD不一定是插入系统调用的好方法,因为a)它只允许截取库调用,b)它只允许截取库调用。;)
A)虽然一般来说,系统调用是由系统中的共享libC封装的,但没有人会阻止您自己调用系统调用,例如,设置正确的寄存器内容,然后在x86系统上发出INT 0x80。如果您感兴趣的程序这样做了,那么您永远不会使用基于LD_PRELOAD的libc-interposition来捕获它们。
B)虽然通常情况下,大多数程序使用系统中的共享libC进行系统调用,但有时应用程序是静态链接的,这意味着libC代码是应用程序的一部分,而不是来自共享库。在这种情况下,LD_PRELOAD也无能为力。
有一条评论已经建议使用strace/ltrace --我的一般性建议是看看ptrace(),这两个工具都使用这两个工具,它应该可以在不修改内核的情况下为您提供所需的内容。
发布于 2011-11-28 19:21:57
Patch-free User-level Link-time intercepting of system calls and interposing on library functions可能可以做到这一点,但我还没有测试过它。
发布于 2011-06-05 01:05:48
我非常确定唯一的方法就是修改系统调用表。HIDS系统(如Samhain)会将此报告为入侵,Linux内核开发人员对此深恶痛绝。实现细节是非常特定于操作系统的(即在FreeBSD上工作的东西不一定在Linux上工作),但一般的实现细节将是相同的。内核模块可能是使用更干净、更标准化的API的更好方法。
https://stackoverflow.com/questions/6238066
复制相似问题