我已经包含了许多系统调用函数,如write(),open()等,LD-PRELOAD用于覆盖原始系统调用。此外,我已经定义了一些函数,并使它成为一个碎片库。
我希望在进入共享库之前捕获来自不同应用程序进程的所有系统调用到这些共享库。我怎么能这样做?
由于
答案 0 :(得分:4)
LD_PRELOAD不一定是插入系统调用的好方法,因为a)它只允许你拦截库调用,而b)它只允许你拦截库调用。 ;)
A)虽然一般情况下,系统调用由系统中的共享libC包装,没有人阻止你自己调用系统调用,例如,但是设置正确的寄存器内容然后在x86系统上发出INT 0x80 。如果您感兴趣的程序这样做,您将永远不会捕获那些基于LD_PRELOAD的libc-interposition。
B)通常,大多数程序使用系统中的共享libC进行系统调用,有时应用程序是静态链接的,这意味着libC代码是应用程序的一部分,而不是来自共享库。在这种情况下,LD_PRELOAD也无济于事。
已建议使用strace / ltrace的注释 - 我的一般建议是查看这两个工具使用的ptrace(),哪些应该可以提供您想要的内容而无需修改内核。 / p>
答案 1 :(得分:1)
Patch-free User-level Link-time intercepting of system calls and interposing on library functions可以做到这一点,但我还没有测试过。
答案 2 :(得分:0)
我很确定你能做到这一点的唯一方法是修改系统调用表。 HIDS系统(如Samhain)会将此报告为入侵者,Linux内核开发人员对此不屑一顾。实现细节非常特定于操作系统(即FreeBSD上的工作原理不一定适用于Linux),但一般实现细节将是相同的。使用更清晰,更标准化的API,内核模块可能是更好的方法。