2017-05-09 13 views
1

マルウェアのようなターゲットプロセスを検出し、監視するためにハイパーバイザーをLinux上で作成したいと考えています。
これを達成するには、ハイパーバイザーが、作成または終了されたプロセスまたはタスクが切り替えられたプロセスを検出する必要があります。ハイパーバイザーを使用して、ターゲットプロセスが作成または終了された時間を監視する方法

intel CPU上で、私はcr3レジスタがそれらの役割を示していることを知っていました。
たとえば、cr3レジスタの値が変更された場合、vmexitが発生します。そして、実行されたプロセスが変更されることを意味します(タスクスイッチまたはプロセスの作成)。

私の目標を達成するために、私はこのメカニズムが非常に使いやすいと思った。

しかし、作成されたプロセスと終了したプロセスを検出するには、cr3の値が変更されたためにvmexitのときにtask_structをスキャンする必要があります。
特に、task_structをターゲットプロセスリストと比較すると、終了プロセスをターゲットプロセスリストから検出して削除できます。

私にベストプラクティスを教えてもらえますか、私のようなOSSを教えてください。 Windowsでは

、私はPsSetCreateProcessNotifyRoutine APIを使用することができるだろうが....

答えて

0

これはまさにlinux perfは、Linux上で何をするかで、あなたは、プロセスの開始と終了時に呼び出される2つのトレースポイントを有効にできます。

# 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

ハイパーバイザーからプロセスが作成されたか破壊されたかを判断することはできません。あなたはこれらの命令のいずれかが実行されたときVMEXITを発生させることができます。

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

これは十分ではありません。これから収集できる唯一の情報は、「このCR3値は、存在する/存在していたプロセスに属します」ということです。

関連する問題