【问题标题】:how to use programming way to intercept system calls invoked in a running process on linux?如何使用编程方式拦截linux上正在运行的进程中调用的系统调用?
【发布时间】:2011-10-15 07:04:00
【问题描述】:
  1. 如何通过外部进程实现?比如说,进程 A 想知道进程 B 中的系统调用是什么?喜欢 strace?
  2. 如何打印出进程本身调用的系统调用?喜欢注册一些活动吗?

谢谢!

【问题讨论】:

标签: c++ c linux system-calls


【解决方案1】:

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

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

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

您可以查看 fakeroot(作为示例)来了解如何操作。

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

【讨论】:

    【解决方案2】:
    1. 使用 ps 或其他方式检查进程 ID。然后运行“strace -p pidnumber”。

    2. 您可以检查 strace 的工作方式、源代码是否可用,或者您可以只在程序中调用 strace...

    【讨论】:

    • 但是有什么编程方法可以做到这一点吗?比如说,一些函数要调用,一些系统调用陷阱事件要处理?
    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 2021-11-20
    • 2013-10-30
    • 1970-01-01
    • 2021-07-06
    • 2022-07-07
    • 2012-09-09
    • 2012-12-02
    相关资源
    最近更新 更多