使用管理程序,如何监视目标进程创建或终止的时间
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".
我想在 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".