
Обозреватель трассировок для реверс-инженеров
Tenet — это плагин для IDA Pro, предназначенный для исследования трасс выполнения. Цель этого плагина — предоставить более естественные, человеческие средства управления для навигации по трассам выполнения в рамках заданной бинарной программы. Основой этой работы послужило желание исследовать новые или инновационные методы анализа и выделения сложных паттернов выполнения в программном обеспечении.
Для дополнительного контекста об этом проекте, пожалуйста, прочитайте статью в блоге, посвящённую его первому выпуску.
Особая благодарность QIRA / geohot и другим за вдохновение.
Tenet — это кроссплатформенный (Windows, macOS, Linux) плагин на Python 3. Он не имеет сторонних зависимостей, что делает код как переносимым, так и простым в установке.
В консоли Python вашего дизассемблера выполните следующую команду, чтобы узнать путь к каталогу плагинов:
import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")Скопируйте содержимое папки /plugins/ этого репозитория в указанный каталог.
Перезапустите ваш дизассемблер.
Этот плагин поддерживается только для IDA 7.5 и новее.
После правильной установки в дизассемблере появится новый пункт меню. Он может быть использован для загрузки внешних трасс выполнения в Tenet.
Поскольку это первый выпуск, Tenet принимает только простые текстовые трассы, читаемые человеком. Пожалуйста, обратитесь к readme по трассировке в этом репозитории для получения дополнительной информации о формате трасс, ограничениях и эталонных трассировщиках.
При использовании Tenet плагин будет «окрашивать» следы, чтобы показать поток выполнения вперед (синим) и назад (красным) от вашей текущей позиции в активной трассе выполнения.
Чтобы шагать вперед или назад во времени, просто прокручивайте, наведя курсор на временную шкалу в правой части дизассемблера. Чтобы перешагнуть вызовы функций, удерживайте SHIFT во время прокрутки.
Временная шкала трассы будет пристыкована к правой стороне дизассемблера. Этот виджет используется для визуализации различных типов событий вдоль временной шкалы трассы и выполнения базовой навигации, как описано выше.
Кликая и перетаскивая по временной шкале, можно увеличить конкретный участок трассы выполнения. Это действие можно повторять любое количество раз для достижения желаемой детализации.
Двойной клик по указателю инструкции в окне регистров выделит его красным, показывая все места, где эта инструкция была выполнена на временной шкале трассы.
Чтобы переключаться между выполнениями, прокручивайте вверх или вниз, наведя курсор на выделенный указатель инструкции.
Кроме того, можно щелкнуть правой кнопкой мыши в листинге дизассемблера и выбрать один из пунктов меню, связанных с навигацией, чтобы быстро перейти к выполнению интересующей инструкции.
Собственная горячая клавиша IDA F2 также может использоваться для установки точек останова на произвольные инструкции.
Двойным щелчком по байту в представлении стека или памяти вы мгновенно увидите все чтения/записи по этому адресу, визуализированные на временной шкале трассы. Желтый цвет обозначает чтение памяти, синий — запись памяти.
Точки останова памяти можно навигировать с помощью той же техники, что описана для точек останова выполнения. Щелкните дважды по байту и прокручивайте, наведя курсор на выбранный байт, чтобы переместить трассу к каждому из его обращений.
Щелчок правой кнопкой мыши по интересующему байту даст вам возможность переключения между чтением/записью/доступом к памяти, если у вас есть конкретное навигационное действие.
Чтобы переместить представление памяти на произвольный адрес, щелкните на представлении памяти и нажмите G, чтобы ввести адрес или символ базы данных для поиска.
Можно установить точку останова памяти на область памяти, выделив блок памяти и дважды щелкнув по нему, чтобы установить точку останова на доступ.
Как и с обычными точками останова памяти, наведение курсора на область и прокрутка могут использоваться для перемещения между обращениями к выбранной области памяти.
В реверс-инжиниринге довольно часто возникают ситуации, когда вы спрашиваете себя: "Какая инструкция установила этот регистр в его текущее значение?"
Используя Tenet, вы можете перейти назад к этой инструкции одним щелчком.
Поиск назад — безусловно, наиболее частое направление навигации по изменениям регистров... но для гибкости вы также можете перейти вперед к следующему присвоению регистра, используя синюю стрелку справа от регистра.
Предоставляется простая «оболочка» для перехода к конкретным временным меткам в трассе. Вставка (или ввод...) временной метки в оболочку с запятыми или без них будет достаточной.
Используя восклицательный знак, вы также можете перейти на указанный «процент» трассы. Ввод !100 перенесет вас к последней инструкции в трассе, а !50 — примерно на 50% пути по трассе. !last перенесет к последней доступной для навигации инструкции, которую можно просмотреть в дизассемблере.
Tenet поставляется с двумя стандартными темами — «светлой» и «темной». В зависимости от цветов, используемых в данный момент вашим дизассемблером, Tenet попытается выбрать наиболее подходящую тему.
Файлы тем хранятся на диске в виде простого JSON и являются высоконастраиваемыми. Если вас не устраивают стандартные темы или цвета, вы можете создать свои собственные темы и просто поместить их в каталог пользовательских тем.
Tenet запомнит ваши предпочтения темы для будущих загрузок и использования.
При наличии времени и мотивации финансирования, будущие работы могут включать:
Я приветствую внешние вклады, сообщения о проблемах и запросы функций. Пожалуйста, делайте любые pull request'ы в ветку develop этого репозитория, если хотите, чтобы они были рассмотрены для будущего релиза.