Spedi — гипотетический дизассемблер Thumb ISA переменного размера. Учитывая файл ELF в качестве входных данных, Spedi может:
Spedi работает непосредственно с двоичными файлами, не используя информацию о символах. В наших экспериментах мы обнаружили, что Spedi превосходит IDA Pro.
Spedi восстанавливает все возможные базовые блоки (BB), доступные в двоичном формате. BB, которые используют одну и ту же инструкцию перехода, группируются в один максимальный блок (MB). Затем МБ уточняются с использованием анализа перекрытия и конфликтов CFG. Подробности можно найти в нашей статье CASES'16 « Спекулятивная дизассемблирование двоичного кода ». Документ доступен здесь.
Spedi (почти) идеально восстанавливает инструкции по сборке из двоичных файлов наших тестов со средним показателем 99,96%. Для сравнения, IDA Pro имеет средний показатель 95,83%, искаженный относительно низкой производительностью в тесте sha .
Spedi точно восстанавливает в среднем 97,46% функций. То есть он определяет правильный начальный и конечный адрес. Сравните это со средним показателем 40,53%, достигнутым IDA Pro.
Приятным свойством нашей методики является то, что она также быстра и хорошо масштабируется при увеличении размера тестового теста. Например, spedi дизассемблирует du (50К инструкций) примерно за 150 мс. Обратите внимание, что есть хорошие возможности для дальнейшей оптимизации.
Для цитирования Спеди в научной работе используйте:
@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
Используйте следующую команду, чтобы дизассемблировать раздел .text
на основе символов сопоставления кода ARM, который предоставляет основную информацию о правильных инструкциях.
$ ./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).