如何使用编程方法拦截linux上运行进程中调用的系统调用

how to use programming way to intercept system calls invoked in a running process on linux?

本文关键字:进程 运行 调用 系统调用 linux 编程 何使用 方法      更新时间:2023-10-16
  1. 如何通过外部流程做到这一点?比如说,进程A想知道进程B中的系统调用是什么?像strace
  2. 如何打印出在进程本身中调用的系统调用?想注册一些活动吗

谢谢!

  1. 用ps或其他什么来检查进程id。然后运行"strace-p pidnumber"。

  2. 你可以检查strace是如何做到的,源代码是可用的,或者你可以从你的程序中调用strace。。。

如果只是关于一个特定的系统调用(而不是全部(,则可以重写C存根函数并将其放置在共享库中,并在执行目标应用程序之前通过设置LD_preload预加载库。

这导致当动态链接器解析函数调用时,您的函数优先于C库提供的函数。

这只适用于动态链接的应用程序(几乎所有(,并且您需要与所使用的C库二进制兼容。由于几乎所有linux都使用glibc,并且不同的glibc版本都是二进制兼容的,所以这应该不是问题。

你可以看看fakeroot(作为一个例子(如何做到这一点

添加:您也可以将调用转发到C库中的实际实现,而不是重新实现整个系统调用包装器。我认为你需要手动加载库并解析地址(不确定,但否则你可能会打电话给自己(。