Данная статья будет состоять из двух частей. В первой части поищем интересные проекты для облегчения процесса обратной разработки, а во второй опробуем их для изучения алгоритмов.
Джентельменский набор ленивого Реверс инженера
К инструментам, которые могут качественно упростить процесс изучения алгоритма любого приложения, можно отнести следущие типы инструментов:
эмуляторы;
библиотеки для разбора форматов файлов;
интерактивные дизассемблеры;
документация;
динамическая инструментация.
Эмуляторы
Эмулятор — это алгоритм или устройство, которое может повторять частично или полностью функции, которые доступны другому устройству или приложению.
Представим ситуацию, что лет 10 назад выпускался компьютер с уникальной архитектурой процессора и на нем можно было поиграть в интересную игру. Сейчас компьютер сломался, компания, которая выпускала игру, закрылась. Новый точно такой же компьютер не купить. И вот, допустим, есть носитель с игрой, но ее не получится нигде запустить. Что делать? Можно попытаться создать эмулятор, который сможет на современном оборудовании повторить алгоритмы работы старого процессора, и снова можно будет играть в уже неподдерживаемую игру.
Причем тут Reverse Engeneering? Дело в том, что современный RE — это занятие, в ходе которого необходимо вычитывать большое количество инструкций, преобразовывать их в промежуточный код и, к сожалению, не всегда получается сделать это эффективно. Эмулятор дает возможность не вчитываться в каждую команду процессора, а позволяет просто смотреть на входные и выходные данные функции и сразу понимать общий алгоритм, который обычно и исследуется.
Какие есть уже готовые примеры эмуляторов и где их можно использовать?
Один из самых успешных эмуляторов — это проект Qemu, он настолько популярен и производителен, что на его базе можно запускать операционные системы. Причем это могут быть как операционные системы, которые привычны для PC, так и операционные системы мобильных устройств. Именно версию Qemu используют Android разработчики, чтобы тестировать приложения без устройства.
С помощью Qemu можно проводить отдладку всех этапов работы операционной системы, включая работу ядра. Для этого достаточно просто включить режим отладки и исследовать логи, которые будет выдавать эмулятор. Фукнционал полезен, но вряд ли в таком виде даст возможность отлаживать что-то более мелкое.
К точно такому же, возможно менее масштабному проекту эмулятора, можно отнести проект bochs. Этот проект ставит целью полноценную эмуляцию устройств, с которыми работает операционная система. Здесь можно изучить, как работает загрузчик операционной системы, и даже заглянуть в реальный режим работы процессора.
Каждый из представленных проектов можно подружить с самыми популярными интерактивными дизассемблерами. Речь идет об IDA Pro, Radare2 и Binary Ninja. Однако существуют и более простые аналоги.
Эмулятор CPU unicorn-engine найти можно здесь. Эмулятор выполнен в виде движка-библиотеки, котрую можно интегрировать в программное обеспечение и обеспечивать тем самым эмуляцию работы платформ, отличных от оригинальной. Обычно эмуляция проводится на процессорах Intel. Если открыть раздел про использование данного эмулятора, можно натолкнуться на очень внушительный список инструментов для анализа уже скомпилированного кода. Это будут и просто эмуляторы, которые используются для обратной совместимости, и приложения, которые анализируют поведение других приложений с точки зрения безопасности. Так же на базе эмулятора проводят построение систем, которые позволяют автоматически заниматься поиском уязвимостей в программном обеспечении.
Популярным с точки зрения RE этот эмулятор стал благодаря тому, что у него есть обертка на Python и целая куча плагинов для IDA, которые используют движок для полной или частичной эмуляции команд внтури приложения.
Библиотеки для разбора форматов файлов
Для понимания, где начинать анализ и как именно хранятся данные в операционной системе/устройстве/сетевом пакете, нужно понимать, как они устроены. Зачастую чтение документации может не помочь и придется разбирать конкретные примеры уже существующих файлов.
Для этих задач удобнее всего пользоваться инструментами, которые знают формат файла и помогут исключить ошибки в его разборе.
Самым популярным и успешным проектом для обработки форматов файлов можно считать Kaitai Struct. Библиотека предоставляет интерпретатор и позволяет задать шаблон, который затем можно применить для изучения формата файла. Интересным использованием этого проекта можно считать плагин для hex редактора Hiew, который позволяет разбирать структуры большого количества типов файлов.
Интерактивные дизассемблеры
Инструменты, которые позволяют хранить все данные о приложении в единой базе. Среди стандартных данных обычно можно встретить:
импорты и экспорты функций;
декомпиллированный листинг функций;
блок-схемы функций (в приложениях это называется graph);
комментарии и заметки;
информация о базовых типах языка программирования с использовнием которого было создано приложение.
Проекты, которые это позволяют делать:
Два последних являются платными, но предоставляют демо версию, где можно ознакомиться с их функционалом.
Динамическая инструментация
Отладчик с "батарейками", позволяющий автоматизировать процесс отладки, записать промежуточные данные или подготовить окружение для запуска всего приложения или отдельной функции.
Для использования этого набора инструментов потребуется знание хотя бы одного из поддерживаемых языков программирования.
Примеры проектов:
Эти проекты также задействуются для плагинов интерактивных дизассемблеров, рассмотрим их в следующей статье.
Автор статьи — Александр Колесников.
Скоро в OTUS пройдет бесплатный двухдневный интенсив «Анализ буткита». На этом занятии разберём работу mbr руткита и проанализируем его ключевые этапы и стадии развёртывания. Регистрация для всех желающих по ссылке.
Mov_AX_0xDEAD
Как будто кто-то из потенциальных слушателей вообще в курсе про существование низкоуровневого программирования, bootchain и прочих ассемблеров