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
。資料檔中有兩列。第一列是二進位檔案的所有原始位元組,第二列是標籤,指示它是函數開始 (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
中顯示的格式。
我們必須對資料進行二值化以使其準備好接受訓練。若要將訓練資料二值化以進行預訓練,請執行:
./scripts/pretrain/preprocess-pretrain-all.sh
準備好預先訓練的二值化訓練資料將儲存在data-bin/pretrain_all
若要將訓練資料二值化以進行微調,請執行:
./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] 瓦斯瓦尼、阿什什等人。 “你所需要的就是注意力。”神經資訊處理系統的進展。 2017年。
[2] 雅各德夫林等人。 “Bert:用於語言理解的深度雙向轉換器的預訓練。” arXiv 預印本 arXiv:1810.04805 (2018)。
[3] 劉銀漢,等. “Roberta:一種穩健優化的 bert 預訓練方法。” arXiv 預印本 arXiv:1907.11692 (2019)。
[4] Shin、Eui Chul Richard、Dawn Song 和 Reza Moazzezi。 “使用神經網路識別二進位檔案中的函數。”第 24 屆 USENIX 安全研討會。 2015年。