我想在linux上使用我的虚拟机管理程序来检测和监视目标进程,就像恶意软件一样 为实现此目的,虚拟机管理程序需要检测创建或终止或任务切换的进程。
在intel CPU上,我知道cr3寄存器表示这些角色
例如,当更改cr3寄存器值时,会导致vmexit
。这意味着执行过程将被更改(任务切换或创建过程)。
为了实现我的目标,我认为这种机制非常有用。
但是,要检测已创建的进程和已终止的进程,由于更改了cr3值,它需要在vmexit
时扫描task_struct。
特别是,将task_struct与目标进程列表进行比较,以检测并从目标进程列表中删除已终止的进程。
你能告诉我最好的做法还是像我一样教我OSS。
在Windows上,我可以使用PsSetCreateProcessNotifyRoutine
API ....
答案 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:
启用它来使用tracepointcd /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
是一个管道,因此您可以在程序中等待并阅读它。