使用管理程序,如何监视目标进程创建或终止的时间

With hypervisor, How to surveillance the time when target process is created or terminated

我想在 linux 上安装我的管理程序,以检测和监视恶意软件等目标进程。
为此,管理程序需要检测创建或终止或任务切换的进程。

在英特尔 CPU 上,我知道 cr3 寄存器指示了这些角色。
例如,当 cr3 寄存器值改变时,vmexit 引起。这意味着执行的进程将被更改(任务切换或创建进程)。

为了达到我的目的,我觉得这个机制很有用。

但是,要检测创建的​​进程和终止的进程,由于更改了 cr3 值,它需要在 vmexit 时扫描 task_struct。
特别是,将 task_struct 与目标进程列表进行比较,以检测并从目标进程列表中删除已终止的进程。

你能告诉我最好的做法还是像我一样教我 OSS。

在 Windows 上,我可以使用 PsSetCreateProcessNotifyRoutine API...

这正是 linux perf 在 linux 上所做的,您可以启用将在进程启动和退出时调用的两个跟踪点:

# perf list
  sched:sched_process_exec                           [Tracepoint event]
  sched:sched_process_exit                           [Tracepoint event]
  sched:sched_process_fork                           [Tracepoint event]
  ....

您可以通过使用 debugfs 启用跟踪点来使用它:

cd /sys/kernel/debug/tracing
echo sched:sched_process_fork >> set_event
echo sched:sched_process_exit >> set_event
echo 1 > tracing_on
cat trace_pipe

你会得到这样的输出:

       <...>-115924 [001] .... 1853164.915266: sched_process_fork: comm=bash pid=115924 child_comm=bash child_pid=115970
       <...>-115970 [002] .... 1853164.915864: sched_process_exit: comm=bash pid=115970 prio=120
       <...>-115924 [001] .... 1853164.916147: sched_process_fork: comm=bash pid=115924 child_comm=bash child_pid=115971
       <...>-115971 [003] .... 1853164.916655: sched_process_exit: comm=bash pid=115971 prio=120
       <...>-115924 [001] .... 1853165.502237: sched_process_fork: comm=bash pid=115924 child_comm=bash child_pid=115972
       <...>-115972 [003] .... 1853165.503027: sched_process_exit: comm=cat pid=115972 prio=120
       <...>-115924 [001] .... 1853176.627842: sched_process_fork: comm=bash pid=115924 child_comm=bash child_pid=115973
       <...>-115973 [003] .... 1853176.628515: sched_process_exit: comm=cat pid=115973 prio=120
       <...>-115924 [001] .... 1853184.520488: sched_process_fork: comm=bash pid=115924 child_comm=bash child_pid=115974

如您所见,每次分叉或终止进程时,都会显示该事件。另外 trace_pipe 是一个管道,所以你可以等待并在你的程序中读取它。

您将无法确定进程是从 Hypervisor 创建还是销毁。当执行了这些指令之一时,您可以导致 VMEXIT 发生:

mov cr3, ...
mov ..., cr3

这还不够。您可以从中收集到的唯一信息是 "This CR3 value belongs to a process that exists/used to exist".