Dna は、LLVM 上に構築された静的バイナリ解析フレームワークです。特筆すべき点として、ほぼ完全に C# で書かれており、LLVM、Remill、Souper 向けのマネージドバインディングも含まれています。
Dna は、SATURN 論文に強く影響を受けた反復的な制御フローグラフ再構築を実装しています。完全な制御フローグラフが復元されるまで、再帰降下、リフティング(remill を使用)、パス解決を反復的に適用します。ジャンプテーブルの場合、Souper と z3 に基づく再帰アルゴリズムを使用して、可能なジャンプテーブルターゲットの集合を解決します。反復探索アルゴリズムはここ、ジャンプテーブル解決アルゴリズムはここで確認できます。
制御フローグラフが完全に探索されると、こことここのアルゴリズムを使用して、x86 に再コンパイルし、バイナリに再挿入できます。コンパイルされたコードは決して美しいものではありませんが、復元された制御フローグラフが正しい限り動作するはずです。とはいえ、これはまだ研究プロトタイプであり、バグやエッジケースが存在することは想定されています。制御フローグラフの探索は、例えば無制限のジャンプテーブルやリフティング不可能な命令の場合には失敗する可能性があります。
その他の注目すべき機能は次のとおりです:
try/ 文と 組み込み関数が制御フローグラフに挿入されます。ただし、リコンパイラは(まだ)SEH をサポートしていないため(SEH エントリは修正されません)、例外が発生するとクラッシュします。catchfilterMemorySSA、LoopInfo、支配木、パスパイプライン管理などのバインディングがあります。いくつかの注意点:
Dna は現在 LLVM 17 に基づいていることに注意してください。
Dna には、Dna.BinaryTranslator/VMProtect にある VMProtect 非仮想化プラグインが含まれています。詳細についてはこの PRを参照してください。
Dna は現在 LLVM 17 を対象としており、Visual Studio 2022 を使用して Windows x64 上でビルドされることを想定しています。
Dna.LLVMInterop を Release モードでビルドしてください。ネイティブ依存関係ツリーは Release でビルドされており、Debug の interop ビルドはサポートされていません。
以下のコマンドを、VS x64 開発者シェル、または VS C++ ツールが PATH に含まれる別のシェルから実行してください。
依存関係スーパービルドは、LLVM 17、Remill、Z3、XED、gflags/glog、および関連するネイティブライブラリを 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
コンパイラ、ビルドタイプ、または CRT 設定を変更する場合は、再構成する前に Dna.LLVMInterop/dependencies/build と Dna.LLVMInterop/dependencies/install の両方を削除してください。
Dna.Example と単純化プロジェクトは、Cargo のリリース出力から eq_sat.dll をコピーします。
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