在控件进入共享库之前捕获系统调用

Lip*_*eka 5 c linux shared-libraries dlopen

我已经包装了一些系统调用函数,如write(),open()等,LD-PRELOAD用于覆盖原始系统调用.此外,我已经定义了一些函数,并使它成为一个碎片库.

我想在进入共享库之前捕获来自不同应用程序进程的所有系统调用到这些共享库.我怎样才能做到这一点?

谢谢

Bjo*_*rnD 5

LD_PRELOAD 不一定是插入系统调用的好方法,因为 a) 它只允许您拦截库调用 b) 它只允许您拦截库调用。;)

A) 虽然一般来说,系统调用由系统中的共享 libC 包装,但没有人阻止您自己调用系统调用,例如,设置正确的寄存器内容,然后在 x86 系统上发出 INT 0x80。如果您感兴趣的程序这样做,那么您将永远不会使用基于 LD_PRELOAD 的 libc-interposition 来捕获那些程序。

B) 虽然一般来说,大多数程序使用系统中的共享 libC 进行系统调用,但有时应用程序是静态链接的,这意味着 libC 代码是应用程序的一部分,而不是来自共享库。在这种情况下,LD_PRELOAD 也无济于事。

已经建议使用 strace/ltrace 的评论——我的一般性建议是查看这两个工具都使用的 ptrace() ,并且无需修改内核即可提供您想要的东西。


Sea*_*ean 0

我很确定做到这一点的唯一方法是修改系统调用表。HIDS 系统(例如 Samhain)会将此报告为入侵,而 Linux 内核开发人员对此非常不满。实现细节对于操作系统来说是非常具体的(即在 FreeBSD 上运行的不一定在 Linux 上运行),但一般的实现细节是相同的。内核模块可能是使用更干净、更标准化的 API 的更好方法。