
Plugin Binary Ninja per analizzare e semplificare codice offuscato
Autori: Tim Blazytko & Nicolò Altamura
Analizza e semplifica codice offuscato
Obfuscation Analysis è un plugin per Binary Ninja che elimina la fatica di lavorare con binari pesantemente protetti. Include una serie di helper mirati che ti permettono di
Alcuni esempi di casi d'uso sono disponibili in examples. Inoltre, il talk di REcon "Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications" dimostra alcuni casi d'uso. Le slide sono disponibili qui. Il plugin complementa Obfuscation Detection: una volta che le funzioni sospette vengono segnalate, Obfuscation Analysis ti aiuta a ripulirle e comprenderle. Altri helper verranno aggiunti nel tempo.
Lo strumento può essere installato tramite il plugin manager di Binary Ninja.
Per un'installazione manuale, segui questi passaggi nella cartella dei plugin di Binary Ninja:
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
Se utilizzi un ambiente virtuale, dovrai impostare manualmente il percorso site-packages nelle impostazioni di Binary Ninja.
Il plugin è disponibile dal menu della barra superiore di Binary Ninja sotto Plugins -> Obfuscation Analysis.
Per semplificare l'offuscamento aritmetico, evidenzia prima l'espressione HLIL che vuoi semplificare nella vista decompilatore. Poi, scegli Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify. Il plugin risolve l'intero calcolo, lo passa attraverso msynth e inserisce il risultato semplificato come commento sulla stessa riga. La breve animazione qui sotto mostra l'intero flusso di lavoro:
La semplificazione MBA si basa su msynth. Per impostazione predefinita, il plugin utilizza l'oracolo di semplificazione predefinito di msynth, che viene fornito con il plugin ed è preconfigurato. Se vuoi utilizzare un oracolo più grande o personalizzato, imposta manualmente obfuscation_analysis.mba_oracle_path o naviga fino al file nella finestra Settings di Binary Ninja.
Se qualcosa va storto, il plugin scrive un messaggio conciso a livello utente nel pannello Log; passa la vista del log a Debug per vedere il traceback completo.
Il plugin include helper mirati che affrontano gli ostacoli comuni che si incontrano durante il reverse engineering di binari protetti, ognuno eseguibile come task in background dall'interfaccia utente o da script head-less. Di seguito sono elencate le funzionalità attualmente disponibili.
Le Funzioni Corrotte sono funzioni il cui disassemblaggio mostra artefatti indefiniti—basic block vuoti, istruzioni non valide o sovrapposte, e simili. Questo helper percorre l'intero BinaryView, segnala le funzioni con questi sintomi e le elenca in modo che l'analista possa ispezionare rapidamente il codice che è stato interpretato erroneamente o deliberatamente offuscato. Un'azione opzionale di rimozione cancella ogni funzione segnalata e forza una nuova analisi, ripulendo la lista delle funzioni. È particolarmente utile per individuare
L'Aritmetica Mista-Booleana (MBA) è una tecnica di offuscamento che seppellisce calcoli semplici in lunghe catene di operazioni aritmetiche e booleane. Questa funzionalità semplifica tali espressioni nel decompilatore. Quando selezioni un'istruzione HLIL, il plugin raccoglie la sua catena di calcolo completa con uno slice all'indietro SSA limitato al basic block corrente, traduce quello slice in Miasm IR, lo passa a msynth e infine aggiunge il risultato semplificato come commento nella vista decompilatore. Questa funzionalità ti permette di
Per la funzione attualmente selezionata, questo helper esegue l'inline ricorsivo di ogni callee all'interno della vista decompilatore, fornendo a Binary Ninja un singolo IL autocontenuto. Una volta rimossi tutti i confini, il decompilatore può propagare i dati attraverso le funzioni, consentendo un constant folding più profondo, l'eliminazione del dead-code e una logica generalmente più chiara. Usalo per
Nota che HLIL può diventare molto grande e lento da renderizzare su funzioni molto grandi o alberi di chiamate profondi. Inoltre, alcune ottimizzazioni del decompilatore potrebbero essere meno efficaci una volta che tutto è unito in un'unica unità. Per controllare questo, puoi limitare la profondità di inlining: imposta Settings -> Obfuscation Analysis -> Max Function Inlining Depth a un limite superiore N (per impostazione predefinita impostato a 1). Con un limite di profondità, vengono inlinati solo i primi N livelli di chiamata; le chiamate più profonde non vengono inlinate.
Il plugin ha alcune avvertenze di cui dovresti essere consapevole, la maggior parte delle quali legate alla pipeline di semplificazione MBA:
Bug di Binary Ninja: su BN 5.0 stable, il passo di backward-slicing potrebbe fallire a causa di type-cast HLIL mancanti: https://github.com/Vector35/binaryninja-api/issues/6371; il problema è risolto in 5.1.7477-de e versioni successive
slice confinato a un basic block: le definizioni di variabili situate nei blocchi predecessori vengono ignorate (spesso dipendenti dal control-flow), quindi alcuni termini MBA potrebbero rimanere parzialmente risolti
lacune nella traduzione da HLIL a Miasm IR: non ogni costrutto HLIL ha un equivalente Miasm corretto; quando la traduzione fallisce l'espressione viene saltata e viene registrato un errore
copertura IL: i nodi di control-flow e le operazioni in virgola mobile attualmente non vengono tradotti
vincoli ereditati da msynth : la semplificazione MBA eredita tutte le limitazioni di msynth
Per maggiori informazioni, contatta Tim Blazytko (@mr_phrazer) o Nicolò Altamura (@nicolodev).