HN 日本語サマリー

← 一覧へ戻る
プログラミング

DDisasm: 可逆(双方向)逆アセンブラ

DDisasm: Reversible (bi-directional) Disassembler (github.com)

44 pointsby aboardRat46 コメント

要約

DDisasmは、Datalog(Souffle)という宣言型論理プログラミング言語を用いて実装された高速かつ高精度な逆アセンブラです。ELF/PEファイル情報を解析し、命令をデコードしてDatalogファクトを生成、コード位置や関数境界を特定します。得られたGTIRB(バイナリ解析・リバースエンジニアリング用中間表現)は、再アセンブル可能なアセンブリコードへの変換やプログラムによるバイナリの変更を可能にします。

全文翻訳

Datalog Disassembly DDisasmは、高速で、生成されたアセンブリコードが再アセンブルできるほど正確な逆アセンブラです。 DDisasmは、逆アセンブリのルールとヒューリスティックをコンパイルするために、Datalog(souffle)宣言型論理プログラミング言語を用いて実装されています。 逆アセンブラはまずELF/PEファイル情報を解析し、可能な命令のスーパーセットをデコードして、Datalogファクトの初期セットを作成します。 これらのファクトは、コードの位置、シンボル化、関数境界を特定するために分析されます。 この分析の結果である、Datalogファクトの洗練されたセットは、バイナリ解析およびリバースエンジニアリングのためにGTIRB中間表現に変換されます。 その後、GTIRBのプリティプリンターを使用して、GTIRBを再アセンブル可能なアセンブリコードにプリティプリントすることができます。 バイナリサポート バイナリフォーマット: ELF (Linux) PE (Windows) 命令セットアーキテクチャ (ISA): x86_32 x86_64 ARM32 ARM64 MIPS32 はじめに Dockerを使用してDDisasmのビルド済みバージョンを実行できます: docker pull grammatech/ddisasm:latest DDisasmは、バイナリをGTIRB表現に逆アセンブルするために使用できます。 リポジトリに含まれる例の1つで試してみましょう。 まず、DDisasm Dockerコンテナを起動します: docker run -v $PWD/examples:/examples -it grammatech/ddisasm:latest Dockerコンテナ内で、例の1つをビルドしましょう: apt update && apt install gcc -y cd /examples/ex1 gcc ex.c -o ex これでバイナリの逆アセンブルに進むことができます: ddisasm ex --ir ex.gtirb GTIRB表現を取得したら、GTIRBまたはgtirb-rewritingを使用してバイナリにプログラム的に変更を加えることができます。 その後、gtirb-pprinter(Dockerイメージに含まれています)を使用して、新しいバージョンのバイナリを生成できます: gtirb-pprinter ex.gtirb -b ex_rewritten 内部的には、gtirb-pprinterはアセンブリファイルを生成し、コンパイラ/アセンブラ(例: gcc)を呼び出して新しいバイナリを生成します。 gtirb-pprinterは、コンパイルオプション、ライブラリ依存関係、またはバージョンリンカスクリプトを含む、新しいバイナリを生成するために必要なすべてのコマンドラインオプションの生成を処理します。 手動での変更のためにアセンブリリストを生成するためにgtirb-pprinterを使用することもできます: gtirb-pprinter ex.gtirb --asm ex.s このアセンブリリストは、手動で再コンパイルできます: gcc -nostartfiles ex.s -o ex_rewritten 詳細については、ドキュメントをご覧ください。 ドキュメント 貢献 CONTRIBUTING.mdを参照してください。 外部貢献者 Programming Language Group, The University of Sydney: ARM64の初期サポート。 Githubユーザー gogo2464: ドキュメントのリファクタリング。 引用 Datalog Disassembly @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 @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 @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} }