
2026/08/03 13:13
DDisasm:可逆(双方向)ディスアセンブラ
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
DDisasm は、Datalog(Souffle)を用いて実装された高速な宣言的ディスアセンブラであり、x86(32/64 ビット)、ARM(32/64 ビット)、および MIPS アーキテクチャにおいて、再組立に適した正確なアセンブリコードの生成が可能です。ELF(Linux)および PE(Windows)のバイナリ形式の両方を処理するように設計されており、ファイルヘッダーをシームレスに解析して命令セットをデコード、関数の境界を特定、コード位置をシンボライズし、発見した情報を GTIRB 中間表現に変換してさらなる分析に供します。本ツールは、事前構築済みの Docker イメージ (
grammatech/ddisasm:latest)、またはコンテナ内の内部ビルドサポートを通じて利用可能です。主要な機能として gtirb-pprinter ユティリティがあり、これは必要なコンパイラコマンドラインオプション、ライブラリ依存関係、リンカスクリプトを自動生成し、手動設定を排除します。当初は ARM64 の初期サポートがシドニー大学のプログラミング言語グループによって提供され、USENIX Security 20(2020 年 8 月)で発表されましたが、現在ではユーザー gogo2464 によるドキュメントのリファクタリングを含む活発なコミュニティ貢献から恩恵を受けています。本プロジェクトは学術協力とオープンソース開発を通じて進化を続けており、直近の進歩として IEEE SP 2025 で発表された「Ddisasm WIS」が研究者に Linux および Windows の両方で強固なバイナリ操作パイプラインの自動化を可能にし、プロジェクトは継続的に発展しています。本文
Datalog Disassembler (DDisasm) の紹介
DDisasm は、生成されたアセンブリコードを再び連結(リリンク)可能な精度を持ちつつ、高速なディスアセッbler です。本ツールは、disassembly のルールとヒューリスティックを実装するための宣言的論理プログラミング言語である Datalog( souffle )を採用しています。
仕組みとワークフロー
DDisasm の処理プロセスは以下の通りです。
- 初期解析
- ELF/PE ファイルの情報を解析します。
- 可能な指令のスーパーセットをデコードして、初期の Datalog 事実集合 を作成します。
- 分析と特定
- 作成された事実は分析され、以下の要素が特定されます:
- コードの位置
- シンボル
- 関数の境界
- 作成された事実は分析され、以下の要素が特定されます:
- GTIRB への変換
- 解析結果に基づいて精緻化された Datalog 事実集合を作成し、それを中間表現である GTIRB へと変換します。
- 出力と整形
- GTIRB プレビュープリンターを使用して、連結可能なアセンブリコードとして GTIRB を整形・出力します。
バイナリ対応
DDisasm が対応するフォーマットとアーキテクチャは以下の通りです。
- ファイルフォーマット
- ELF(Linux)
- PE(Windows)
- 指令セットアーキテクチャ (ISA)
- x86_32
- x86_64
- ARM32
- ARM64
- MIPS32
始め方
プレビルド版を Docker を使用して手軽に実行できます。
1. コンテナの起動
まず、サンプルコードの一つを試してみましょう。Docker コンテナを開始します。
docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest
コンテナ内では、以下の手順でサンプルバイナリを準備します:
- GCC をインストールします。
- サンプルコード (
) をコンパイルしてバイナリを作成します。ex.c
apt update && apt install gcc -y cd /examples/ex1 gcc ex.c -o ex
これでディスアセムブルの準備が完了しました。
2. GTIRB 表現への処理と再構築
GTIRB 表現を取得後、gtirb-rewriting を使用してプログラムを変更できます。その後、新しいバージョンのバイナリを生成します。
-
自動生成による再コンパイル
- Docker イメージに含まれる
を使用すると、必要なコマンドラインオプション(コンパイルオプション、ライブラリ依存関係、バージョンリンカースクリプトなど)を自動生成して新しいバイナリを作成します。gtirb-pprinter
gtirb-pprinter ex.gtirb -b ex_rewritten - Docker イメージに含まれる
-
手動修正用のアセンブリリストの生成
を使用して、手動での修正を行えるアセンブリリストも出力できます。gtirb-pprinter
gtirb-pprinter ex.gtirb --asm ex.s上記で生成されたアセンブリリストを手動で再コンパイルする例:
gcc -nostartfiles ex.s -o ex_rewritten
詳細な情報は当社のドキュメントをご確認ください。
ドキュメントと貢献者
貢献について
詳細は
CONTRIBUTING.md を参照してください。
外部コントリビューター
- プログラミング言語グループ、シドニー大学: ARM64 の初期サポートを提供。
- GitHub ユーザー gogo2464: ドキュメントのリファクタリングに貢献。
引用情報
研究論文に関する引用情報は以下の通りです。
Datalog Disassembly (USENIX Security 20)
@inproceedings{flores-montoya2020, author = {Antonio Flores-Montoya and Eric Schulte}, title = {Datalog Disassembly}, booktitle = {29th USENIX Security Symposium (USENIX Security 20)}, year = {2020}, isbn = {978-1-939133-17-5}, pages = {1075--1092}, url = {https://www.usenix.org/conference/usenixsecurity20/presentation/flores-montoya}, publisher = {USENIX Association}, month = aug, }
GTIRB (arXiv)
@misc{schulte2020gtirb, title={GTIRB: Intermediate Representation for Binaries}, author={Eric Schulte and Jonathan Dorn and Antonio Flores-Montoya and Aaron Ballman and Tom Johnson}, year={2020}, eprint={1907.02859}, archivePrefix={arXiv}, primaryClass={cs.PL} }
Ddisasm WIS (IEEE Symposium on Security and Privacy 2025)
@INPROCEEDINGS{11023516, author={Flores-Montoya, Antonio and Lim, Junghee and Seitz, Adam and Sood, Akshay and Raff, Edward and Holt, James}, booktitle={2025 IEEE Symposium on Security and Privacy (SP)}, title={Disassembly as Weighted Interval Scheduling with Learned Weights}, year={2025}, volume={}, number={}, pages={3033-3050}, keywords={Measurement;Privacy;Accuracy;Heuristic algorithms;Reverse engineering;Binary codes;Benchmark testing;Scheduling;Inference algorithms;Security;disassembly;reverse engineering;learning;binary analysis}, doi={10.1109/SP61157.2025.00192}}