
Binary-Ninja-Plugin zum Analysieren und Vereinfachen von obfuskiertem Code
Autoren: Tim Blazytko & Nicolò Altamura
Obfuskierten Code analysieren und vereinfachen
Obfuscation Analysis ist ein Binary-Ninja-Plugin, das die Arbeit mit stark geschützten Binärdateien erleichtert. Es bündelt eine Handvoll gezielter Helfer, mit denen Sie
Einige Anwendungsbeispiele finden Sie in examples. Darüber hinaus demonstriert der REcon-Vortrag „Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications" einige Anwendungsfälle. Die Folien finden Sie hier. Das Plugin ergänzt Obfuscation Detection: Sobald verdächtige Funktionen markiert sind, hilft Obfuscation Analysis dabei, sie zu bereinigen und zu verstehen. Im Laufe der Zeit werden weitere Helfer hinzugefügt.
Das Tool kann über den Plugin-Manager von Binary Ninja installiert werden.
Für eine manuelle Installation führen Sie die folgenden Schritte im Plugin-Ordner von Binary Ninja aus:
git clone https://github.com/mrphrazer/obfuscation_analysis.git
cd obfuscation_analysis
# optionally: use a virtual environment
python -m venv obfana-env
source obfana-env/bin/activate
# install requirements
pip install -r requirements.txt
Wenn Sie eine virtuelle Umgebung verwenden, müssen Sie den site-packages-Pfad in den Binary-Ninja-Einstellungen manuell festlegen.
Das Plugin ist über das Menü in der oberen Leiste von Binary Ninja unter Plugins -> Obfuscation Analysis verfügbar.
Um arithmetische Obfuskation zu vereinfachen, markieren Sie zunächst den HLIL-Ausdruck, den Sie in der Decompiler-Ansicht vereinfachen möchten. Wählen Sie anschließend Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify. Das Plugin löst die vollständige Berechnung auf, führt sie durch msynth und fügt das vereinfachte Ergebnis als Kommentar in derselben Zeile ein. Die kurze Animation unten zeigt den gesamten Workflow:
Die MBA-Vereinfachung basiert auf msynth. Standardmäßig verwendet das Plugin msynths Standard-Vereinfachungs-Oracle, das mit dem Plugin ausgeliefert und vorkonfiguriert ist. Wenn Sie ein größeres oder benutzerdefiniertes Oracle verwenden möchten, legen Sie obfuscation_analysis.mba_oracle_path manuell fest oder navigieren Sie im Einstellungsfenster von Binary Ninja zur Datei.
Wenn etwas schiefgeht, schreibt das Plugin eine prägnante Meldung auf Benutzerebene in den Log-Bereich; wechseln Sie die Log-Ansicht auf Debug, um den vollständigen Traceback zu sehen.
Das Plugin liefert gezielte Helfer, die auf häufige Hindernisse beim Reversing geschützter Binärdateien abzielen und jeweils als Hintergrundaufgabe über die UI oder headless-Skripte ausgeführt werden können. Nachfolgend sind die derzeit verfügbaren Funktionen aufgeführt.
Beschädigte Funktionen sind Funktionen, deren Disassemblierung undefinierte Artefakte aufweist – leere Basisblöcke, ungültige oder überlappende Instruktionen und Ähnliches. Dieser Helfer durchläuft die gesamte BinaryView, markiert Funktionen mit diesen Symptomen und listet sie auf, sodass der Analyst Code, der falsch geparst oder absichtlich obfuskiert wurde, schnell inspizieren kann. Eine optionale Entfernungsaktion löscht jede markierte Funktion und erzwingt eine neue Analyse, wodurch die Funktionsliste bereinigt wird. Dies ist besonders nützlich zum Auffinden von
Mixed-Boolean Arithmetic (MBA) ist eine Obfuskationstechnik, die einfache Berechnungen in langen Ketten arithmetischer und boolescher Operationen vergräbt. Diese Funktion vereinfacht solche Ausdrücke im Decompiler. Wenn Sie eine HLIL-Instruktion auswählen, sammelt das Plugin ihre vollständige Berechnungskette mit einem SSA-Rückwärts-Slice, der auf den aktuellen Basisblock beschränkt ist, übersetzt diesen Slice in Miasm IR, speist ihn in msynth ein und fügt schließlich das vereinfachte Ergebnis als Kommentar in der Decompiler-Ansicht hinzu. Diese Funktion ermöglicht es Ihnen,
Für die aktuell ausgewählte Funktion inlined dieser Helfer rekursiv jeden Aufgerufenen in der Decompiler-Ansicht und gibt Binary Ninja eine einzige, in sich geschlossene IL. Da alle Grenzen entfallen sind, kann der Decompiler Daten über Funktionsgrenzen hinweg propagieren, was tieferes Constant Folding, Dead-Code-Elimination und allgemein klarere Logik ermöglicht. Verwenden Sie es, um
Beachten Sie, dass HLIL bei sehr großen Funktionen oder tiefen Aufrufbäumen sehr groß und langsam zu rendern werden kann. Darüber hinaus können einige Decompiler-Optimierungen weniger effektiv sein, sobald alles zu einer einzigen Einheit zusammengeführt wurde. Um dies zu steuern, können Sie die Inlining-Tiefe begrenzen: Setzen Sie Settings -> Obfuscation Analysis -> Max Function Inlining Depth auf eine Obergrenze N (standardmäßig auf 1 gesetzt). Mit einer Tiefenbegrenzung werden nur die ersten N Aufrufebenen inlined; tiefere Aufrufe werden nicht inlined.
Das Plugin hat einige Einschränkungen, die Sie kennen sollten, die meisten davon betreffen die MBA-Vereinfachungs-Pipeline:
Binary-Ninja-Bug: In BN 5.0 stable kann der Rückwärts-Slicing-Schritt aufgrund fehlender HLIL-Typumwandlungen fehlschlagen: https://github.com/Vector35/binaryninja-api/issues/6371; das Problem ist in 5.1.7477-de und neuer behoben
Slice auf einen Basisblock beschränkt: Variablendefinitionen in Vorgängerblöcken werden ignoriert (oft kontrollflussabhängig), sodass einige MBA-Terme teilweise aufgelöst bleiben können
Lücken bei der Übersetzung von HLIL zu Miasm IR: Nicht jedes HLIL-Konstrukt hat ein korrektes Miasm-Äquivalent; wenn die Übersetzung fehlschlägt, wird der Ausdruck übersprungen und ein Fehler protokolliert
IL-Abdeckung: Kontrollflussknoten und Gleitkommaoperationen werden derzeit nicht übersetzt
geerbte msynth-Einschränkungen : Die MBA-Vereinfachung erbt alle msynth-Einschränkungen
Für weitere Informationen wenden Sie sich an Tim Blazytko (@mr_phrazer) oder Nicolò Altamura (@nicolodev).