【问题标题】:Is there a way to intercept every system call an application makes in Linux? [closed]有没有办法拦截应用程序在 Linux 中进行的每个系统调用? [关闭]
【发布时间】:2021-11-20 09:52:48
【问题描述】:

我想编写一个应用程序(用 C 语言,可执行并从命令行启动它),它基本上监视用户空间中正在进行的系统调用。您可以将其视为过滤器。如果进行调用的进程感兴趣,请存储正在进行系统调用的事实,否则什么也不做。如果它们是由某个特定进程创建的,则需要存储哪个进程以及进行了哪些系统调用。有什么办法可以做到这一点?这可以从用户空间实现还是我应该编写某种驱动程序?

编辑 1:

该应用程序不会使用任何 GUI。我希望它通过命令行启动(作为可执行文件)并等待该 cmd 中的停止信号。此外,如果它应该监视用户空间中的所有进程,则接收要监视的进程的 PID 或“全部”。我希望它收集有关应用程序的数据,包括它们正在制作的 sys 调用、哪些参数并存储该信息,以便与不是本问题对象的其他应用程序一起处理它。

编辑 2:

不,我无法重新编译受监控的应用程序。例如,我想监控 Spotify、Chrome 或其他任何东西。也许我把它们称为应用程序是错误的,我想监视在用户空间中运行的进程。

【问题讨论】:

  • 你熟悉strace吗?
  • 你为什么要问?如果你的仪器不完美会怎样?
  • 请通过激励来改进您的问题并提供更多细节。被监控的应用程序是静态链接的吗?它可以是任何可执行文件吗?它是开源的吗?它是否使用了一些 GUI 工具包(例如GTK...)?它是一个运行了几个月的守护进程吗?它是几百千字节的小型可执行文件,还是像 Firefox 这样的怪物应用程序?它是否生成机器代码(如SBCL 那样)?它是否接受带有dlopen(3) 的插件?

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

是的,你想了解和使用ptrace(2)(可能还有chroot(2)execve(2)elf(5)的详细信息,或者ld.so(8)...)

strace(1) 实用程序是开源的,并使用ptraceGNU gdb 调试器也是如此。

你可能想研究他们的源代码。

注意并害怕潜在的heisenbugs

GNU glibc 是开源的(并包含动态链接器ld.so)。通过努力,您可以考虑对其进行修补并在其中使用 Ian Taylor 的libbacktrace

如果允许您从最近的 GCC 编译的 C 或 C++ 源代码重新编译观察到的应用程序,请考虑开发您的 GCC plugin(可能在 2021 年底从 Bismon 开始)。

这可以从用户空间实现吗?

是的,但要花费数个月的预算。

请记住,聪明的用户可以重新编译他/她自己的 Linux 内核版本(可能使用改进的GNU libc)并避免使用您的检测层。

PS。我的直觉是,您定义不明确的问题可能与Rice's theoremHalting problem 有关。我建议就你的主题开始一篇博士论文。

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2011-10-15
    • 1970-01-01
    • 2010-09-09
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多