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

时间:2017-05-09 05:04:19

标签: c linux linux-kernel intel hypervisor

我想在linux上使用我的虚拟机管理程序来检测和监视目标进程,就像恶意软件一样 为实现此目的,虚拟机管理程序需要检测创建或终止或任务切换的进程。

在intel CPU上,我知道cr3寄存器表示这些角色 例如,当更改cr3寄存器值时,会导致vmexit。这意味着执行过程将被更改(任务切换或创建过程)。

为了实现我的目标,我认为这种机制非常有用。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

您可以使用debugfs:

启用它来使用tracepoint
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是一个管道,因此您可以在程序中等待并阅读它。