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年。