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

标签 c linux linux-kernel intel hypervisor

我想在 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/

相关文章:

c - C语言如何在不停止程序的情况下使用scanf?

python - 安装 OpenCV,没有名为 cv2.cv 的模块

c - 使用c在linux上以 block 的形式读写

linux - linux重启的详细步骤

c - LKM 崩溃取决于硬件?

c++ - 跨平台方式获取一天中的时间?

c - 关于C程序中显示十进制值的问题

c - 使用 md5sum 更简单的不变量

java - 斯卡拉/Java/Linux : is it possible to monitor a system process passively?

logging - 将 Linux 内核日志缓冲区扩大到 2M 以上