
Легко перенастраиваемый и настраиваемый интерактивный дизассемблер с API плагинов, совместимым с IDAPython.
ScratchABit — это интерактивный инкрементальный дизассемблер с возможностями анализа потоков данных и управления. ScratchABit посвящён усилиям сообщества разработчиков open-source в области реверс-инжиниринга (реверс-инжиниринг для создания драйверов/прошивок с открытым исходным кодом для оборудования, не имеющего надлежащей поддержки со стороны производителей, для совместимости аппаратного и программного обеспечения, для исследований безопасности).
ScratchABit поддерживает широко известный в сообществе API IDAPython для написания модулей дизассемблирования/расширения.
ScratchABit находится в разработке, функции добавляются по мере необходимости, приветствуются вклады.
ScratchABit распространяется на условиях GNU General Public License v3 (GPLv3).
Не должен быть написан на запутанном языке. К таким языкам относятся слишком низкоуровневые языки, которые позволяют обращаться к неинициализированным переменным, не различают переменные и функции/процедуры, начинают индексы массивов с произвольных чисел и т.д., и т.п. ScratchABit написан на Python (современная версия, Python3) для вашего удовольствия и здравомыслия.
Инфраструктура пользовательского интерфейса должна позволять взаимодействие с пользователем на необходимом уровне, не добавлять зависимостей, раздувания, проблем и несовместимости между версиями фреймворка. ScratchABit в настоящее время использует простой полноэкранный текстовый пользовательский интерфейс с использованием управляющих последовательностей терминала ANSI/VT100 (да, даже библиотека curses была сочтена слишком раздутой зависимостью, чтобы навязывать её пользователям).
Следует использовать простые текстовые форматы для хранения «базы данных», чтобы облегчить повторное использование и написание инструментов, а также хранение в системах контроля версий.
Для использования ScratchABit вам потребуется установленный Python3 (проверено с Python 3.3 по 3.7) и терминал или эмулятор терминала VT100 (минимум) или XTerm (рекомендуется) (любая Unix-система должна быть совместима, например Linux/BSD и т.д., см. FAQ ниже для подробностей).
Клонируйте код с помощью:
git clone --recursive https://github.com/pfalcon/ScratchABit
Если вы клонировали код без --recursive, выполните git submodule update --init в каталоге ScratchABit.
Начиная с версии 2.0, в ScratchABit включён плагин(ы) CPU на основе Capstone Engine, которые обеспечивают доступ к ряду архитектур CPU. Для его использования должен быть установлен свежий модуль привязок Python для Capstone (предпочтительнее, чем пакеты, поставляемые дистрибутивами ОС, которые часто устарели). Самый простой способ установить его — в каталог пользовательских пакетов Python:
pip3 install --no-cache-dir --user capstone
Альтернативно, вы можете установить его в виртуальное окружение Python внутри каталога ScratchABit:
python3 -m venv .venv
source .venv/bin/activate
pip3 install --no-cache-dir capstone
Всякий раз, когда вы открываете новый сеанс терминала для работы с ScratchABit, снова выполните команду source .venv/bin/activate, чтобы активировать виртуальное окружение.
Если ничего из вышеперечисленного не работает, вы можете попробовать установить пакет capstone системно (не рекомендуется):
sudo pip3 install --system capstone
Если вы хотите дизассемблировать файл в самоописываемом исполняемом формате (например, ELF), просто передайте его в качестве аргумента ScratchABit.py. Репозиторий включает несколько файлов example-*.elf для различных архитектур для быстрого старта. Например, чтобы попробовать 32-битную версию x86:
python3 ScratchABit.py example-x86_32.elf
В качестве альтернативы, если вы хотите дизассемблировать сырой бинарный файл, вам нужно создать .def (определение) файл, чтобы указать, какие области памяти определены для кода, по какому адресу загружать бинарный файл и т.д. (Примечание: .def файл может быть полезен и для файлов .elf и подобных). В репозитории есть простой сырой бинарный код x86_64 и соответствующий файл example-x86_64.def (загляните внутрь для описания доступных опций):
python3 ScratchABit.py example-x86_64.def
Нажмите F9 для доступа к меню (мышь также работает в терминалах, совместимых с XTerm). Нажмите F1 для получения справки по привязкам клавиш (большинство действий также доступны через меню). Рабочий процесс ScratchABit похож на другие интерактивные дизассемблеры (может быть полезен некоторый предыдущий опыт или чтение фоновой информации).
Плагины процессоров IDAPython могут быть загружены из любого места в пути модулей Python. Альтернативно, вы можете создать симлинк/скопировать файл(ы) плагина .py в подкаталог plugins/cpu/.
После того как плагин стал доступен, создайте новый файл определения на основе example-x86_64.def, который устанавливает имя модуля плагина (без расширения .py) в строке cpu xxx.
Для очень простого примера, использующего внешний плагин, см. этот файл esp8266.def, который работает с плагином xtensa.py из репозитория ida-xtensa2.
В: Какие процессоры/архитектуры поддерживаются?
О: ScratchABit не поддерживает ни одну архитектуру процессора сам по себе, он полностью перенастраиваем с помощью плагинов API IDAPython. Доступно много плагинов, написать новый плагин легко. Чтобы дать пользователям возможность опробовать ScratchABit, в дистрибутив включён простой плагин процессора x86, использующий дизассемблер Pymsasid под капотом.
Начиная с версии 2.0, также включён плагин Capstone, обеспечивающий доступ к ряду архитектур, включая x86, ARM, MIPS, PowerPC, SPARC и т.д. (поддержка архитектур включается постепенно на основе пользовательского тестирования).
Вы можете прочитать о плагинах, поставляемых вместе с ScratchABit, в README для каталога plugins/cpu/.
В: Отладчик?
О: ScratchABit посвящён статическому анализу и лёгкой поддержке новых архитектур CPU (просто напишите новый плагин CPU на Python — вы можете получить первые результаты за несколько часов). Динамический анализ не задумывался как основная функция, и немедленных планов по его реализации нет. Однако патчи приветствуются.
В: Декомпилятор?
О: Существует связанный проект, называемый ScratchABlock, для глубокого анализа программ, трансформации и декомпиляции. Ожидается, что по мере взросления ScratchABlock некоторые его функции станут доступны в ScratchABit (возможно, через плагины).
В: Я не на Linux, как мне запустить ScratchABit?
О: Установите Linux в эмуляторе/ВМ на вашей системе и радуйтесь.
В: Обязательный скриншот?
О: Конечно:
