
Binary Ninja-Plugin zur Identifizierung von obfuskiertem Code und anderen interessanten Codekonstrukten
Autor: Tim Blazytko
Erkennen Sie automatisch verschleierten Code und andere interessante Codekonstrukte
Obfuscation Detection ist ein Binary-Ninja-Plugin zur Erkennung von verschleiertem Code und interessanten Codekonstrukten (z. B. Zustandsautomaten) in Binärdateien. Das Plugin erleichtert die Analyse, indem es Codestellen identifiziert, die während des Reverse Engineerings einen genaueren Blick wert sein könnten.
Basierend auf verschiedenen Heuristiken lokalisiert das Plugin Funktionen, die komplexe oder ungewöhnliche Codekonstrukte enthalten. Solche Codekonstrukte können Folgendes implementieren:
Die folgenden Blogbeiträge enthalten weitere Informationen zu den zugrunde liegenden Heuristiken und zeigen deren Anwendungsfälle:
Einige Beispielanwendungen finden Sie in examples. Darüber hinaus demonstriert der REcon-Vortrag „Unveiling Secrets in Binaries using Code Detection Strategies“ einige Anwendungsfälle. Die Folien finden Sie hier; die Aufzeichnung finden Sie hier.
Das Tool kann über den Plugin-Manager von Binary Ninja installiert werden.
Für die Headless-Version gehen Sie wie folgt vor:
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# obfuscation_detection installieren
pip install .
Das Plugin kann in der Benutzeroberfläche und im Headless-Modus verwendet werden.
Wählen Sie Plugins -> Obfuscation Detection, um einzelne Heuristiken auszuführen, oder Plugins -> Obfuscation Detection -> Utils, um einzelne Dienstprogramme auszuführen. Der Befehl Plugins -> Obfuscation Detection -> All führt alle Heuristiken und alle Dienstprogramme gemeinsam aus.
Die Ergebnisse werden im Log-Fenster angezeigt:
Durch Klicken auf die identifizierten Funktionsadressen navigiert Binary Ninja zur ausgewählten Funktion.
Um das Plugin im Headless-Modus zu verwenden, führen Sie scripts/detect_obfuscation.py aus:
$ python3 scripts/detect_obfuscation.py <binary>
Dies führt alle Heuristiken und alle Dienstprogramme aus. Für maschinenlesbare Ausgabe übergeben Sie --json:
$ python3 scripts/detect_obfuscation.py --json <binary>
Das JSON-Payload enthält alle Ergebnisse unter dem Schlüssel detections. Jede Erkennung hat eine stabile id für die Automatisierung und einen menschenlesbaren name. Jeder getaggte Funktionsfund enthält den Tag-Typ und die Beschreibung, die vom Binary-Ninja-Plugin verwendet werden.
Um nur die Zustandsautomaten-Heuristik im Headless-Modus auszuführen, verwenden Sie scripts/detect_state_machine.py:
$ python3 scripts/detect_state_machine.py [--json] <binary>
Das Plugin implementiert verschiedene Erkennungsheuristiken, um unterschiedliche Codekonstrukte zu erkennen. Im Folgenden beschreiben wir kurz die einzelnen Heuristiken und erläutern ihre Verwendung.
Die Large-Basic-Block-Heuristik identifiziert die obersten 10 % der Funktionen mit der größten durchschnittlichen Anzahl von Instruktionen pro Basisblock. Sie ermöglicht die Erkennung von
Die Complex-Function-Heuristik identifiziert die obersten 10 % der Funktionen mit den komplexesten Kontrollflussgraphen (basierend auf zyklomatischer Komplexität). Sie ermöglicht die Identifizierung von
Die Zustandsautomaten-Heuristik nutzt graphentheoretische Eigenschaften, um Funktionen zu identifizieren, die Zustandsautomaten implementieren. Üblicherweise lassen sich solche Zustandsautomaten als switch-Anweisungen darstellen, die in einer Schleife abgearbeitet werden. Die Heuristik ermöglicht die Identifizierung von
Die Uncommon-Instruction-Sequence-Heuristik führt eine statistische Analyse durch, um die obersten 10 % der Funktionen zu identifizieren, deren Codemuster von einem vorberechneten Grundwahrheitswert abweichen. Auf diese Weise ermöglicht die Heuristik die Identifizierung von
Die Overlapping-Instruction-Heuristik identifiziert Funktionen mit disaligned Instructions (Instruktionsbytes werden von zwei verschiedenen Instruktionen gemeinsam genutzt). Die Heuristik identifiziert
Wird die Heuristik in der Benutzeroberfläche von Binary Ninja verwendet, werden überlappende Instruktionen auch in der Graphenansicht hervorgehoben.
Die Most-Called-Function-Heuristik identifiziert die obersten 10 % der Funktionen mit der größten Anzahl von Aufrufen aus verschiedenen Funktionen. Auf diese Weise kann die Heuristik
identifizieren.
Die Heuristik identifiziert Funktionen mit einer hohen Anzahl von Schleifen. Diese Art von Funktionen könnte Folgendes implementieren:
Die Heuristik hilft auch dabei, potenzielle Leistungsengpässe zu lokalisieren.
Die Heuristik identifiziert Funktionen mit seltenen und komplexen Schleifenstrukturen, die typischerweise auf Folgendes hindeuten:
Die Heuristik identifiziert Funktionen, die innerhalb einer Schleife eine XOR-Operation mit einer Konstanten durchführen. Auf diese Weise kann die Heuristik
identifizieren.
Die Heuristik identifiziert Funktionen, in denen die Ausdrücke gleichzeitig mehr als eine arithmetische Operation und eine boolesche Operation enthalten. Auf diese Weise kann die Heuristik
identifizieren.
Die Heuristik verwendet einen iterativen Kontext-Hashing-Ansatz, um wiederholte Multi-Block-Strukturen im Kontrollflussgraphen jeder Funktion zu erkennen. Durch den Vergleich der Opcode-Signatur jedes Blocks mit den Signaturen seiner Nachfolger identifiziert die Heuristik Subgraphen, die in einer einzelnen Funktion dupliziert oder nahezu dupliziert wurden. Dies hilft beim Auffinden von:
Das Plugin enthält auch engere Dienstprogramme für interessante Funktionen und Codebereiche. Sie bleiben im Untermenü Utils verfügbar; der Befehl All führt sie zusammen mit den breiteren Heuristiken aus.
Dieser Helfer identifiziert Funktionen ohne bekannte Aufrufer. Diese Funktionen könnten
Dieser Helfer identifiziert Funktionen, die keine anderen Funktionen aufrufen. Diese Art von Funktionen kann zum Beispiel Funktionen sein, die
Dieser Helfer identifiziert rekursive Funktionen – Funktionen, die sich direkt oder indirekt selbst aufrufen. Rekursive Funktionen können auf Folgendes hindeuten:
Dieser Helfer bewertet die Entropie jedes Abschnitts. Entropie ist ein statistisches Maß für Zufälligkeit mit Werten zwischen 0 und 8. Abschnitte mit einer Entropie nahe 8 weisen auf ein hohes Maß an Zufälligkeit hin und können auf Folgendes hindeuten:
Dieser Helfer erkennt potenzielle Implementierungen des RC4-Algorithmus, indem er heuristische Marker verwendet, die typischerweise mit RC4s Key Scheduling Algorithm (KSA) und Pseudo-Random Generation Algorithm (PRGA) verbunden sind. RC4 wird häufig in Malware für Zwecke wie
eingesetzt.
Für weitere Informationen kontaktieren Sie @mr_phrazer.