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 接受。如果您對 x64 支援感興趣,可以查看他們的工具。
但請注意,他們的工具基於這樣的假設:最近的 x64 編譯器在.rodata
節中分配跳轉表資料。這使得指令恢復變得更加容易,因為它可以透過線性掃描可靠地完成。相較之下,Spedi 使用推測性反彙編來處理更一般的混合程式碼/資料情況。
此專案依賴Capstone反彙編庫(v3.0.4)。