XDA は命令を逆アセンブルし、ストリップされたバイナリの関数境界を回復するツールです。これは、マスクされた言語モデリング目標を備えた Transformer エンコーダを使用した転移学習に基づいています [1、2、3]。これは、最先端のツール (IDA Pro、Ghidra、双方向 RNN [4] など) よりも優れたパフォーマンスを発揮します。詳細については、論文「XDA: 転移学習による正確で堅牢な逆アセンブリ」を参照してください。
@inproceedings{pei2021xda,
title={XDA: Accurate, Robust Disassembly with Transfer Learning},
author={Pei, Kexin and Guan, Jonas and King, David Williams and Yang, Junfeng and Jana, Suman},
year={2021},
booktitle={Proceedings of the 2021 Network and Distributed System Security Symposium (NDSS)}
}
conda
使用して環境をセットアップし、必要なパッケージをインストールすることをお勧めします。
まず、conda環境を作成します。
conda create -n xda python=3.7 numpy scipy scikit-learn colorama
そして conda 環境をアクティブ化します。
conda activate xda
次に、最新の Pytorch をインストールします (GPU があると仮定します)。
conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch
最後に、xda ルート ディレクトリ (例: path/to/xda
を入力し、XDA をインストールします。
pip install --editable .
path/to/xda
にcheckpoints
とcheckpoints/pretrain_all
ディレクトリを作成します。
mkdir -p checkpoints/pretrain_all
事前トレーニング済みの重みパラメータをダウンロードして、 checkpoints/pretrain_all
に追加します。
また、関数境界回復を直接実行できるように、微調整されたモデルも提供します。微調整されたモデルは、MSVC x64 によってコンパイルされたバイナリでトレーニングされます。 path/to/xda
にcheckpoints/finetune_msvs_funcbound_64
サブディレクトリを作成します
mkdir -p checkpoints/finetune_msvs_funcbound_64
微調整された重みパラメータをダウンロードして、 checkpoints/finetune_msvs_funcbound_64
に追加します。
MSVC x64 によってコンパイルされた BAP コーパスからのサンプル データの一部をdata-raw/msvs_funcbound_64_bap_test
に配置しました。データ ファイルには 2 つの列があります。最初の列はバイナリのすべての生バイトで、2 番目の列は関数開始 (F)、関数終了 (R)、またはそのどちらでもないことを示すラベルです。
これらのファイルの関数境界を予測するには、次を実行します。
python scripts/play/play_func_bound.py
このスクリプトは、 checkpoints/finetune_msvs_funcbound_64
に設定した微調整された重みを読み込み、関数の境界を予測します。また、グラウンドトゥルースや IDA の結果とも比較されます。
事前トレーニングと微調整のサンプル トレーニング/テスト ファイルをdata-src/
で提供します。
data-src/pretrain_all
には、事前トレーニング用に除去されたバイナリからのサンプル生バイトが含まれていますdata-src/funcbound
は、関数境界を持つサンプルの生のバイトが含まれています私たちはすでに膨大な数のバイナリで事前トレーニングされたモデルを提供しています。ただし、独自に収集したデータで事前トレーニングしたい場合は、 data-src/pretrain_all
の形式と同様のサンプル ファイルを準備できます (すべてのバイナリのすべてのバイトを連結し、 n
改行で区切って、各行が重複しないようにします)モデルが許容する最大長を超えています)。同様に、微調整データを自分で準備する場合は、 data-src/funcbound
に示されている形式に従っていることを確認してください。
データをトレーニングできるようにするには、データを 2 値化する必要があります。事前トレーニング用にトレーニング データを 2 値化するには、次を実行します。
./scripts/pretrain/preprocess-pretrain-all.sh
事前トレーニングの準備ができたバイナリ化されたトレーニング データはdata-bin/pretrain_all
に保存されます。
微調整のためにトレーニング データを 2 値化するには、次を実行します。
./scripts/finetune/preprocess.sh
微調整の準備ができたバイナリ化されたトレーニング データ (関数境界用) はdata-bin/funcbound
に保存されます。
事前トレーニングに独自の解析済みバイナリを使用しており、それらをdata-bin/pretrain_all
ですでにバイナリ化している場合は、次を実行します。
./scripts/pretrain/pretrain-all.sh
モデルを微調整するには、次を実行します。
./scripts/finetune/finetune.sh
スクリプトは、事前トレーニングされた重みパラメータをcheckpoints/pretrain_all/
からロードし、モデルを微調整します。
birnn/
に置きます。 速度評価のために、 https://github.com/CUMLSec/XDA/blob/main/scripts/play/speed_eval.py
にスクリプトを配置しました。
[1] Vaswani、Ashish、他。 「必要なのは注意力だけです。」神経情報処理システムの進歩。 2017年。
[2] デブリン、ジェイコブ、他。 「バート: 言語理解のための深い双方向トランスフォーマーの事前トレーニング。」 arXiv プレプリント arXiv:1810.04805 (2018)。
[3] Liu、Yinhan、他。 「Roberta: 堅牢に最適化された Bert 事前トレーニング アプローチ。」 arXiv プレプリント arXiv:1907.11692 (2019)。
[4] シン、ウィ・チョル・リチャード、ドーン・ソング、レザ・モアッゼッジ。 「ニューラルネットワークによるバイナリ関数の認識」第24回USENIXセキュリティシンポジウム。 2015年。