Spedi 是可变大小 Thumb ISA 的推测反汇编程序。给定 ELF 文件作为输入,Spedi 可以:
Spedi 直接处理二进制文件,不使用符号信息。我们在实验中发现 Spedi 的性能优于 IDA Pro。
Spedi 恢复二进制文件中所有可能的可用基本块 (BB)。共享相同跳转指令的 BB 被分组在一个最大块 (MB) 中。然后,使用重叠和 CFG 冲突分析来细化 MB。详细信息可以在我们的 CASES'16 论文“二进制代码的推测性反汇编”中找到。该论文可在此处获取。
Spedi(几乎)完美地从我们的基准二进制文件中恢复了汇编指令,平均恢复率为 99.96%。相比之下,IDA Pro 由于sha基准性能相对较差,平均偏差为 95.83%。
Spedi 平均准确恢复了 97.46% 的功能。也就是说,它标识正确的起始地址和结束地址。与 IDA Pro 达到的平均 40.53% 进行比较。
我们技术的一个很好的特性是它速度很快,并且随着基准大小的增加而可以很好地扩展。例如,spedi 在大约 150 ms 内反汇编du (50K 指令)。请注意,还有进一步优化的良好空间。
要在学术著作中引用 Spedi,请使用:
@inproceedings{BenKhadraSK2016,
author = {Ben Khadra, M. Ammar and Stoffel, Dominik and Kunz, Wolfgang},
title = {Speculative Disassembly of Binary Code},
booktitle = {Proceedings of the International Conference on Compilers, Architectures and Synthesis for Embedded Systems},
year = {2016},
location = {Pittsburgh, Pennsylvania},
articleno = {16},
doi = {10.1145/2968455.2968505},
acmid = {2968505},
publisher = {ACM},
}
构建项目并在此存储库中提供的基准套件中的二进制文件之一上进行尝试。
以下命令将指示spedi
推测性地反汇编.text
部分,
$ ./spedi -t -s -f $FILE > speculative.inst
使用以下命令根据 ARM 代码映射符号反汇编.text
部分,该部分提供了有关正确指令的基本事实,
$ ./spedi -t -f $FILE > correct.inst
比较两个输出的最简单方法是使用,
$ diff -y correct.inst speculative.inst | less
目前,您需要手动修改main.cpp
以显示与切换表和调用图恢复相关的结果。
该工具是一个学术概念验证。目前,它不在我们的优先列表中。然而,我们对未来有一些设想,即:
bx
和blx
)。本文提供了一些相关细节。最近,安德里斯等人。等人。一直致力于Nucleus
的开发,这是一个用于 x64 二进制文件中的函数识别的工具。他们的论文“二进制中与编译器无关的函数检测”被 IEEE Euro S&P 2017 接受。他们或多或少使用了在 Spedi 中实现的相同函数识别技术。如果您对 x64 支持感兴趣,可以查看他们的工具。
但请注意,他们的工具基于这样的假设:最近的 x64 编译器在.rodata
节中分配跳转表数据。这使得指令恢复变得更加容易,因为它可以通过线性扫描可靠地完成。相比之下,Spedi 使用推测性反汇编来处理更一般的混合代码/数据情况。
该项目依赖于Capstone反汇编库(v3.0.4)。