我想在 linux 上制作我的虚拟机管理程序来检测和监视目标进程,例如恶意软件。
为此,管理程序需要检测创建、终止或任务切换的进程。
在intel 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
如您所见,每次 fork 或终止进程时,都会显示该事件。 trace_pipe
也是一个管道,因此您可以等待并在您的程序中读取它。
关于c - 使用管理程序,如何监视目标进程创建或终止的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43861536/