如何记录任何进程中的每条指令和内存变化

如何记录任何进程中的每条指令和内存变化

我读这里这:

Falco 依赖于一个内核模块进入机器上的系统调用流并将这些系统调用传递给用户空间。

(强调我的)。

这暗示了记录来自任意进程的任意指令调用的可能性(但不完全是),这就是我想知道如何做的。

有人推荐我 ptrace/strace/dtrace/gdb (我有一台 Mac),但我想知道我可以为其编写一个内核模块来记录哪些低级(可能是内核级)功能任何进程已经在我的机器上后台运行。以同样的方式ps列出正在运行的进程,并top保留它们的更新面板和一些统计数据,我想基本上完全控制一个进程。也就是说,给定pid 123,我会在程序中执行pause 123step 123暂停或执行一步,然后inspect 123查看计算机的完整内存布局,看看内存发生了哪些变化。所有这一切都没有 ptrace/dtrace/strace/gdb。

这可能是一个广泛的主题,但我想指出在哪里寻找更多信息的正确区域。具体来说,这似乎可能是内核模块,从而访问内核 API 公开的一些功能。我不确定这在技术上是否可行(观察任何过程从外部,在任何时候,并控制其评估),或者如果任何其中一部分是可能的。我首先想知道其中哪些部分是可能的/不可能的,然后我可以在哪里寻找更多信息。

我见过的几个教程gdb都希望您直接运行/调用您的程序/脚本gdb,如gdb myscript.这就是它如何访问步进/暂停等的意义。程序的行为。但我想更进一步。而不是要求您的程序(如 gdb)调用该程序直接地,相反,它的工作原理是附加到程序已经运行在后台。然后,只需附加到程序即可从外部,它允许您暂停/单步/检查/等等。不确定这是否可能。但这样我就可以从一开始就检查我的计算机正在执行的守护进程和其他事情。

答案1

gdb 可以完全按照您的描述进行操作。您可以使用以下命令附加到正在运行的进程 123:

$ gdb -p 123

或者传递可执行文件的路径:

$ gdb /path/to/program 123

您可以使用gdb 提示符下的命令具有相同的效果。

这似乎可以完成您所描述的所有操作,因为 gdb 已经能够暂停、单步执行和检查附加进程的内存(甚至可以执行更多操作,例如修改内存内容。)

gdb 使用的底层内核功能是跟踪(2)(注意,有龙!),因此,如果您想要类似于 gdb 但在某些方面有所不同的东西,您可以考虑使用 ptrace 来实现此目的。

开发一个新的内核接口当然是可以完成的,但目前还不清楚这会提供什么,而 ptrace 仍然不能...这种功能所需的钩子可能对内核有很大的侵入性,因此您需要大量修补内核源代码树来创建类似于 ptrace 的东西(不太可能在简单的可加载内核模块中完成。)

简而言之,gdb 和 ptrace 执行您所描述的操作。您当然可以开发该工具和系统调用的替代品,只是不清楚这样做的意义是什么。

相关内容