Dna adalah kerangka analisis biner statis yang dibangun di atas LLVM. Khususnya ditulis hampir seluruhnya di C#, termasuk binding yang dikelola untuk LLVM, Remill, dan Souper.
Dna mengimplementasikan rekonstruksi grafik aliran kontrol berulang sangat terinspirasi oleh kertas Saturnus. Ini secara iteratif menerapkan keturunan rekursif, mengangkat (menggunakan remill), dan pemecahan jalur sampai grafik aliran kontrol lengkap dipulihkan. Dalam kasus tabel lompatan, kami menggunakan algoritma rekursif berdasarkan Souper dan Z3 untuk menyelesaikan set target tabel lompatan yang mungkin. Anda dapat menemukan algoritma eksplorasi berulang di sini, dan algoritma pemecahan meja lompat di sini.
Setelah grafik aliran kontrol telah sepenuhnya dieksplorasi, ia dapat dikompilasi ulang ke x86 dan dimasukkan kembali ke dalam biner menggunakan algoritma dari sini dan di sini. Meskipun kode yang dikompilasi tidak cantik dengan cara apa pun , itu harus berjalan selama grafik aliran kontrol yang dipulihkan benar. Yang sedang berkata, itu masih merupakan prototipe penelitian - bug dan kasus tepi diharapkan. Eksplorasi grafik aliran kontrol mungkin gagal dalam kasus tabel lompatan yang tidak terbatas atau instruksi yang tidak dapat dipindahkan.
Beberapa fitur penting lainnya:
try / catch pernyataan dan filter intrinsik dimasukkan ke dalam grafik aliran kontrol. Meskipun kompilen tidak (belum) mendukung SEH (entri SEH tidak diperbaiki), sehingga pengecualian akan menyebabkan kecelakaan.MemorySSA EG, LoopInfo , pohon dominator, lulus manajemen pipa, dll.Beberapa peringatan:
Perhatikan bahwa Dna saat ini didasarkan pada LLVM 17.
Dna tidak akan dibangun di luar kotak. Patch khusus untuk melonggarkan dan souper diperlukan agar ini dibangun di atas jendela. Jika Anda ingin mengerjakan DNA, buka masalah atau email saya [email protected] . Pada titik tertentu saya dapat menerbitkan langkah -langkah pembuatan yang tepat, tetapi saya tidak membuat jaminan.