2017-05-09 27 views
1

我想让我的虚拟机管理程序在Linux上用于检测和监视目标进程,如恶意软件。
要实现这一点,管理程序需要检测创建或终止或任务切换的进程。使用虚拟机管理程序,如何监视创建或终止目标进程的时间

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

为了达到我的目标,我认为这个机制非常有用。

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

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

在Windows中,我将能够使用PsSetCreateProcessNotifyRoutine API ....

回答

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使其与跟踪点玩:

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也是一个管道,这样你就可以等待并在程序中读取它。

0

您将无法确定某个进程是否由Hypervisor创建或销毁。您可能会导致当这些指令任何一个已经执行VMEXIT发生:

mov cr3, ... 
mov ..., cr3 

这是不够的。您可以从中收集的唯一信息是“此CR3值属于存在/用于存在的进程”。

相关问题