
Framework di analisi statica binaria basato su LLVM
Dna è un framework di analisi binaria statica costruito su LLVM. È notevolmente scritto quasi interamente in C#, incluse le gestioni gestite per LLVM, Remill e Souper.
Dna implementa una ricostruzione iterativa del grafo del flusso di controllo fortemente ispirata all'articolo SATURN. Applica iterativamente la discesa ricorsiva, il sollevamento (usando remill) e la risoluzione dei percorsi fino a quando il grafo del flusso di controllo completo non viene recuperato. Nel caso delle tabelle di salto, utilizziamo un algoritmo ricorsivo basato su Souper e z3 per risolvere l'insieme delle possibili destinazioni delle tabelle di salto. Puoi trovare l'algoritmo di esplorazione iterativa qui, e l'algoritmo di risoluzione delle tabelle di salto qui.
Una volta che un grafo del flusso di controllo è stato completamente esplorato, può essere ricompilato in x86 e reinserito nel binario utilizzando gli algoritmi da qui e qui. Sebbene il codice compilato non sia bello da nessun punto di vista, dovrebbe funzionare purché il grafo del flusso di controllo recuperato sia corretto. Detto questo, è ancora un prototipo di ricerca - bug e casi limite sono previsti. L'esplorazione del grafo del flusso di controllo potrebbe fallire in caso di, ad esempio, tabelle di salto illimitate o istruzioni non sollevabili.
Altre caratteristiche degne di nota:
try/catch e gli intrinseci filter vengono inseriti nel grafo del flusso di controllo. Sebbene il ricompilatore non supporti (ancora) SEH (le voci SEH non sono corrette), quindi le eccezioni causeranno crash.MemorySSA, LoopInfo, alberi dominatori, gestione della pipeline dei pass, ecc.Alcune avvertenze:
Nota che Dna è attualmente basato su LLVM 17.
Dna contiene un plugin di devirtualizzazione VMProtect situato in Dna.BinaryTranslator/VMProtect. Vedi questa PR per maggiori informazioni.
Dna attualmente targetta LLVM 17 ed è previsto che venga compilato su Windows x64 con Visual Studio 2022.
Compila Dna.LLVMInterop in modalità Release; l'albero delle dipendenze native è compilato in Release e le build Debug di interoperabilità non sono supportate.
Esegui i comandi seguenti da una shell sviluppatore x64 di VS, o da un'altra shell con gli strumenti C++ di VS nel PATH.
La superbuild delle dipendenze installa LLVM 17, Remill, Z3, XED, gflags/glog e le librerie native correlate in Dna.LLVMInterop/dependencies/install.
cmake -S Dna.LLVMInterop/dependencies `
-B Dna.LLVMInterop/dependencies/build `
-G Ninja `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_C_COMPILER=clang-cl `
-DCMAKE_CXX_COMPILER=clang-cl
cmake --build Dna.LLVMInterop/dependencies/build
Se si cambia compilatore, tipo di build o impostazioni CRT, elimina sia Dna.LLVMInterop/dependencies/build che Dna.LLVMInterop/dependencies/install prima di riconfigurare.
Dna.Example e i progetti del simplificatore copiano eq_sat.dll dall'output di rilascio di Cargo.
cargo build --manifest-path Simplifier/EqSat/Cargo.toml --release
& "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" `
Dna.sln `
/restore `
/p:Configuration=Release `
/p:Platform=x64 `
/m