Промежуточное представление грамматех для двоичных файлов (GTIRB) представляет собой анализ машинного кода и переписывание структуры данных. Он предназначен для облегчения связи бинарного ИК между программами, выполняющими бинарную разборку, анализ, трансформацию и красивую печать. GTIRB моделируется на LLVM-IR и стремится выполнить аналогичную функцию поощрения общения и взаимодействия между инструментами.
Остальная часть этого файла описывает различные аспекты GTIRB:
GTIRB имеет следующую структуру. Сплошные линии обозначают наследование. Пунктирные линии обозначают ссылку на UUID.
Экземпляр GTIRB может включать несколько модулей ( Module ), которые представляют загружаемые объекты, такие как исполняемые файлы или библиотеки, график межпроцедурного потока управления ( IPCFG ) и таблицы вспомогательных данных ( AuxData ), которые могут содержать результаты произвольного анализа в форматах определенных пользователей, которые могут легко ссылаться на другие элементы IR. Каждый модуль содержит информацию, такую как символы ( Symbol ) и разделы, которые сами содержат фактические байты и данные и кодовые блоки модуля. CFG состоит из основных блоков ( Block ) и краев потока управления между этими блоками. Каждый данных или кодовый блок ссылается на диапазон байтов в интервале байта ( ByteInterval ). В разделе может содержаться один большой интервал байта, удерживающий все блоки-если определены относительные положения блоков в этом разделе-или могут содержать один интервал байта на блок-если относительные положения блоков не определены, например, для кодовых блоков в разделе .text во время перезаписи программы. Каждый символ содержит указатель на блок или дату, который он ссылается.
GTIRB явно не представляет инструкции или семантику инструкций, но предоставляет символическую информацию операнда и доступ к байтам. Существует множество промежуточных языков (IL) для представления семантики обучения (например, BAP BIL, ANGR Vex или P-код Ghidra). GTIRB работает с этими или любыми другими IL путем хранения инструкций в целом и эффективно в качестве необработанных байтов машинного кода и отдельно хранения символической информации и информации о потоке управления. Популярный декодер/энкодер Capstone/Keystone предоставляет отличную опцию для чтения и написания инструкций с/до представления байта в Gtirb без предприятия какого-либо конкретного семантического IL. Поддерживая несколько ILS и отдельное хранение анализа приводит к вспомогательным таблицам данных GTIRB обеспечивает сотрудничество между независимым бинарным анализом и переписыванием групп и инструментов.
GTIRB предусматривает обмен дополнительной информацией, например, результаты анализа в виде объектов AuxData . Они могут хранить карты и векторы основных типов GTIRB портативным образом. Руководство по GTIRB описывает структуру для общих типов вспомогательных данных, таких как информация о границе функции, информация о типе или результаты общих анализов в стандартных схемах AuxData.
Каждый элемент GTIRB --- например, модули ( Module ), символы ( Symbol ) и блоки ( Block ) --- универсально уникальный идентификатор (UUID). Uuids позволяют как первоклассные ИК-компоненты, так и таблицы Auxdata для ссылки на элементы IR.
Инструкции и символические операнды могут быть рассмотрены с помощью Offset класса, которое инкапсулирует UUID (который относится к блоку инструкции) и смещением.
В настоящее время существуют пакеты для легкости установки GTIRB (и сопутствующего инструмента, включая Ddisasm Disasssembler и Gtirb-Pprinter Pretty Printer) на Windows, и Ubuntu 20. См. Ниже инструкции. Кроме того, в Grammatech/Ddisasm существует общедоступное изображение Docker с установленными всеми этими инструментами. GTIRB имеет версию Major.Minor.Patch, где приращения основных версий потребуют значительных изменений источника, но должны быть очень редкими, незначительные приращения версий могут потребовать небольших изменений источника, а приращение версий исправлений не должно нарушать нисходящие сборки. Мы еще не обеспечиваем совместимость с ABI в любых изменениях версии.
Последний стабильный API GTIRB Python может быть установлен из PYPI с использованием PIP:
pip install gtirbПоследняя нестабильная версия Python API может быть установлена из предварительно построенного колеса:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl Крайне важно, чтобы выбор stable или unstable упаковки соответствовал установленным пакетам DDISASM и GTIRB-Pprinter.
Выпуски Windows упакованы в виде файлов .zip и доступны по адресу https://download.grammatech.com/gtirb/files/windows-release/.
Пакеты для Ubuntu 20 доступны в репозитории GTIRB APT и могут быть установлены в соответствии с следующими инструкциями.
Во -первых, добавьте удачный ключ Grammatech.
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -Следующее обновите свой файл sources.list.
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.listГде:
[distribution] является focal (в настоящее время доступны только пакеты Ubuntu 20)[component] либо stable , который содержит последнюю версию, либо unstable , который удерживает голову репозитория.Наконец -то обновите базу данных пакетов и установите основные инструменты GTIRB:
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm Предупреждение : стабильные версии gtirb-2.0.0, gtirb-pprinter-2.1.0, ddisasm-1.8.0 и старше полагаются на метапаки, которые вызывают конфликты, если вы попробуете apt-get upgrade (см. #63). В этом случае удалите и переустановите пакеты, которые вы получили из репозитория GTIRB. Вам может потребоваться использовать dpkg --remove для удаления метапочек (например, ddisasm ), прежде чем снимать бетонные версионные пакеты (например, ddisasm-1.5.1 ). Новые стабильные версии больше не полагаются на метапакки и могут быть обновлены без проблем.
API GTIRB C ++ должен успешно построить в 64-битных компиляторах GCC, Clang и Visual Studio, поддерживающих хотя бы C ++ 17. GTIRB использует CMAKE, который должен быть установлен хотя бы с версией 3.10.
Общий процесс сборки выглядит так:
mkdir build
cd build
# Note: You may wish to add some -D arguments to the next command. See below.
cmake < path/to/gtirb >
cmake --build .
# Run the test suite.
ctestДля настройки сборки GTIRB вы можете получить список параметров настройки, перейдя в свой каталог сборки и запустив:
cmake -LHДля создания и установки GTIRB должны быть установлены следующие требования:
cmake .libprotobuf-dev и protobuf-compiler .GTIRB предназначен для сериализации с использованием буферов Google Protocol (IE, ProtoBuf), что позволяет легко и эффективно использовать любой язык программирования.
GTIRB также может использоваться через выделенный API, реализованный на нескольких языках. API предоставляют эффективные структуры данных, подходящие для использования бинарным анализом и переписыванием приложений; Смотрите ниже для деталей.
GTIRB использует сериализованный формат, который состоит из 8-байтовой подписи, за которой следуют сериализованные данные Protobuf. Данные Protobuf позволяют исследовать и манипулировать языком по вашему выбору. Домашняя страница Google протокола перечисляет языки, на которых буферы протокола могут использоваться непосредственно; Пользователи других языков могут преобразовать данные Protobuf-формата в формат JSON, а затем использовать данные JSON в своих приложениях.
Справочник proto в этом репозитории содержит определения типа сообщений протокола для GTIRB. Вы можете осмотреть эти файлы .proto , чтобы определить структуру различных типов сообщений GTIRB. Тип сообщения верхнего уровня IR .
Для получения более подробной информации см. Использование сериализованных данных GTIRB.
GTIRB API в настоящее время доступен в C ++, Python и Common LISP. Существует частичный Java API, который не готов к внешнему использованию. Для независимой от языка информации API см. Компоненты GTIRB. Для получения информации о различных реализациях API см.