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

时间:2011-07-28 16:24:32

标签: c++ c linux system-calls

  1. 如何通过外部流程完成?说,进程A想知道进程B中系统调用了什么?喜欢strace?
  2. 如何打印在进程本身中调用的系统调用?喜欢注册一些活动吗?
  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

  1. 用ps或其他方法检查进程ID。然后运行“strace -p pidnumber”。

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

答案 1 :(得分:0)

如果它只是一个特定的系统调用(不是全部),您可以重新编写C stub函数并将其放在共享库中,并在执行目标应用程序之前预先加载库,方法是设置LD_PRELOAD。

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

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

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

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