
Definieren und abgleichen von benutzerdefinierten Graphenmustern mit binären Kontrollflussgraphen unter Verwendung eines Capstone-basierten Disassemblers, mit CLI, Python-Bindungen und IDA-Plugin-Unterstützung.
grap nimmt Muster und Binärdateien entgegen, verwendet einen Capstone-basierten Disassembler, um die Kontrollflussgraphen aus den Binärdateien zu extrahieren, und gleicht dann die Muster mit ihnen ab.
Muster sind benutzerdefinierte Graphen mit Instruktionsbedingungen („opcode ist xor und arg1 ist eax“) und Wiederholungsbedingungen (3 identische Instruktionen, Basisblöcke...).
grap ist als eigenständiges Werkzeug mit einem Disassembler und Python-Bindungen sowie als IDA-Plugin verfügbar, das die von IDA und dem Reverser durchgeführte Disassemblierung nutzt.
Unterstützung:




Dieses Dokument beschreibt, wie man grap auf einer Linux-Distribution baut und installiert.
Sie können auch lesen:
Neben Compilern (build-essential) müssen folgende Abhängigkeiten installiert sein:
Daher sollte dies unter Ubuntu / Debian funktionieren:
sudo apt-get install build-essential cmake bison flex libboost-regex-dev libboost-system-dev libboost-filesystem-dev libseccomp-dev python3-dev python3-pefile python3-pyelftools python3-capstone swig
Bitte beachten Sie, dass diese für das neueste Ubuntu LTS (18.04.3) getestet wurden. Die Pakete können je nach Ihrer Distribution abweichen.
Die folgenden Befehle bauen und installieren das Projekt:
mkdir build; cd build/ wie wir empfehlen, das Projekt in einem dedizierten Verzeichnis zu bauencmake ../src/; make baut mit cmake und makesudo make install installiert grap nach /usr/local/bin/SWIG könnte Python3 nicht finden, wenn Ihre Standardversion Python2 ist; dies kann behoben werden, indem Sie Python3 als Standard einstellen. Zum Beispiel unter Ubuntu:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
Das Werkzeug kann mit folgendem Befehl gestartet werden:
$ grap [options] pattern test_paths
Unten sind einige Beispiele für unterstützte Optionen:
grap -h: beschreibt unterstützte OptionenMan kann grap ein Muster aus einer Zeichenkette ableiten lassen. Es werden nur wenige Optionen unterstützt, aber dies ist nützlich für die Prototypenerstellung:
grap "opcode is xor and arg1 contains '['" (test.exe): sucht nach einem xor mit einem Speicherschreibzugriffgrap -v "sub->xor->sub" (test.exe): -v gibt den Pfad des abgeleiteten Musters ausWählen Sie, wie die Binärdateien disassembliert werden:
grap -od (pattern.grapp) samples/*: disassembliert Dateien im Ordner samples/ ohne Erkennungsversuchgrap -f (pattern.grapp) (test.exe): erzwingt die erneute Disassemblierung der Binärdatei und gleicht sie dann mit pattern.grapp abgrap --raw (pattern.grapp) (test.bin): disassembliert eine rohe Datei (verwenden Sie --raw-64 für 64-Bit-Binärdateien)Steuern Sie die Ausführlichkeit der Ausgabe:
grap -q -sa (pattern.grapp) (samples/*.grapcfg): gleicht disassemblierte Dateien ab, zeigt passende und nicht passende Dateien an, eine pro Zeilegrap -m (pattern.grapp) (test.grapcfg): zeigt alle erkannten Knoten anWählen Sie, wo die disassemblierten Datei(en) (.grapcfg) geschrieben werden; gleichen Sie mehrere Dateien mit mehreren Mustern ab:
grap patterns/basic_block_loop.grapp -o ls.grapcfg /bin/ls: disassembliert ls in ls.grapp und sucht nach Basisblock-Schleifengrap (pattern1.grapp) -p (pattern2.grapp) (test.exe): gleicht mit mehreren Musterdateien abgrap -r -q patterns/ /bin/ -o /tmp/ : disassembliert alle Dateien aus /bin/ nach /tmp/ und gleicht sie mit allen .grapp-Mustern aus patterns/ ab (die rekursive Option -r gilt für /bin/, nicht für patterns/)Das folgende Muster erkennt eine Entschlüsselungsschleife bestehend aus einem xor, gefolgt von sub, gefunden in einer Backspace-Beispielprobe:
digraph decryption_md5_4ee00c46da143ba70f7e6270960823be {
A [cond=true, repeat=3]
B [cond="opcode is xor and arg2 is 0x11"]
C [cond="opcode is sub and arg2 is 0x25"]
D [cond=true, repeat=3]
E [cond="opcode beginswith j and nchildren == 2"]
A -> B
B -> C
C -> D
D -> E
E -> A [childnumber=2]
}
Beachten Sie, dass Musterdateien mehrere Mustergraphen enthalten können.
Weitere Musterbeispiele finden Sie in zwei Verzeichnissen:
Zu Malware-Proben:
Nutzung der Python-Bindungen:
Weitere Dokumentation finden Sie im Ordner doc/:
Die Syntax von Muster- und Testgraphen wird in der Datei grap_graphs.pdf im Release-Bereich detailliert beschrieben.
grap ist unter der MIT-Lizenz lizenziert. Der vollständige Lizenztext ist in LICENSE zu finden.