2017-05-09 4 views
1

Ich möchte meinen Hypervisor auf Linux für die Erkennung und Überwachung von Zielprozess wie eine Malware machen.
Um dies zu erreichen, muss der Hypervisor Prozesse erkennen, die erstellt oder beendet oder Task-switched sind.Mit Hypervisor, Wie zur Überwachung der Zeit, wenn Zielprozess erstellt oder beendet wird

Auf Intel CPU wusste ich, dass cr3 Register diese Rollen anzeigen.
zum Beispiel, wenn cr3 Registerwert geändert wird, vmexit verursacht. Und es bedeutet, dass der ausgeführte Prozess geändert wird (Taskwechsel oder Erstellungsprozess).

Um mein Ziel zu erreichen, dachte ich, dass dieser Mechanismus sehr benutzerfreundlich ist.

Um jedoch den erstellten Prozess und den beendeten Prozess zu erkennen, muss task_struct überprüft werden, wenn vmexit aufgrund des geänderten cr3-Werts vorliegt.
Vergleichen Sie insbesondere task_struct mit Zielprozesslisten, um den beendeten Prozess aus den Zielprozesslisten zu erkennen und zu entfernen.

Können Sie mir die beste Praxis sagen oder mir OSS wie meins beibringen.

Unter Windows ich wäre in der Lage PsSetCreateProcessNotifyRoutine API verwenden ....

Antwort

0

Das ist genau das, was linux perf tut auf Linux, könnten Sie die beiden Verfolgungspunkte ermöglichen, die bei Prozessstart und Ausgang aufgerufen wird:

# perf list 
    sched:sched_process_exec       [Tracepoint event] 
    sched:sched_process_exit       [Tracepoint event] 
    sched:sched_process_fork       [Tracepoint event] 
    .... 

Sie können mit Tracepoint spielen, indem sie es mit debugfs aktivieren:

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 

Sie Ausgabe wie folgt erhalten:

 <...>-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 

Wie Sie sehen können, wird jedes Mal, wenn ein Prozess verzweigt oder beendet wird, das Ereignis angezeigt. Auch die trace_pipe ist eine Pipe, so dass Sie darauf warten und in Ihrem Programm lesen können.

0

Sie können nicht feststellen, ob ein Prozess vom Hypervisor erstellt oder gelöscht wurde. Sie können dazu führen, VMEXIT auftreten, wenn einer dieser Befehle ausgeführt wurden:

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

Dies ist nicht genug. Die einzige Information, die Sie daraus erhalten können, ist "Dieser CR3-Wert gehört zu einem Prozess, der existiert/existiert".

Verwandte Themen