
Интерактивный плагин для пропатчивания бинарных файлов для IDA Pro

Патчинг ассемблерного кода для изменения поведения существующей программы — не редкость в анализе вредоносного ПО, реверс-инжиниринге программного обеспечения и других областях исследований безопасности. Этот проект расширяет популярный дизассемблер IDA Pro, создавая более надёжный интерактивный рабочий процесс патчинга бинарного кода, предназначенный для быстрой итерации.
В настоящее время проект работает на основе небольшого форка широко используемого Keystone Engine, поддерживая патчинг x86/x64 и Arm/Arm64 с планами включить остальные архитектуры Keystone в будущих выпусках.
Особая благодарность Hex-Rays за поддержку разработки этого плагина.
Этот плагин требует IDA 7.6 и Python 3. Он поддерживает Windows, Linux и macOS.
Обратите внимание: старые версии IDA (8.2 и ниже) несовместимы с Python 3.11 и выше.
Выполните следующую строку в консоли IDA для автоматической установки плагина:
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py').read())
import urllib.request as r; exec(r.urlopen('https://github.com/gaasedelen/patching/raw/main/install.py', cafile='/etc/ssl/cert.pem').read())
Кроме того, плагин можно установить вручную, скачав распространяемый пакет плагина для вашей платформы со страницы релизов и распаковав его в папку plugins.
Настоятельно рекомендуется устанавливать этот плагин в пользовательскую директорию плагинов IDA:
import ida_diskio, os; print(os.path.join(ida_diskio.get_user_idadir(), "plugins"))
Плагин патчинга автоматически загружается для поддерживаемых архитектур (x86/x64/Arm/Arm64) и добавляет соответствующие действия по патчингу в контекстное меню правой кнопки мыши в окнах дизассемблера IDA:

Полный список контекстных действий по патчингу описан в следующих разделах.
Основной диалог патчинга можно запустить через действие «Сборка» в контекстном меню правой кнопки мыши. Он имитирует базовый вид дизассемблера IDA, который можно использовать для редактирования одной или нескольких инструкций подряд.

Строка ассемблера — это редактируемое поле, которое можно использовать для изменения инструкций в реальном времени. Нажатие Enter фиксирует (применяет патч) введённую инструкцию в базе данных.
Ваше текущее местоположение (т.е. курсор) всегда будет выделено зелёным цветом. Инструкции, которые будут перезаписаны в результате вашего патча/редактирования, будут выделены красным цветом до фиксации патча.

Наконец, клавиши со стрелками ВВЕРХ и ВНИЗ можно использовать, находясь в фокусе редактируемого текстового поля ассемблера, чтобы быстро перемещать курсор вверх и вниз по дизассемблеру без использования мыши.
Самое распространённое действие патчинга — замена одной или нескольких инструкций на NOP. По этой причине действие NOP всегда будет видно в контекстном меню для быстрого доступа.

Отдельные инструкции можно заменить на NOP, а также выбранный диапазон инструкций.
Принуждение условного перехода к всегда выполнению «хорошего» пути — ещё одно распространённое действие патчинга. Плагин будет показывать это действие только при щелчке правой кнопкой мыши по инструкции условного перехода.

Если вы никогда не хотите, чтобы условный переход выполнялся, вы можете просто заменить его на NOP!
Патчи можно сохранить (применить) к выбранному исполняемому файлу через подменю патчинга в любое время. Действие быстрого применения позволяет ещё быстрее сохранять последующие патчи с теми же настройками.

Плагин также активно старается сохранить резервную копию (.bak) исходного исполняемого файла, которую он использует для «чистого» применения текущего набора патчей из базы данных при каждом сохранении.
Наконец, если вы когда-либо остались недовольны патчем, вы можете просто щёлкнуть правой кнопкой мыши по заплаченным (жёлтым) блокам инструкций, чтобы вернуть их к исходным значениям.

Хотя «легко» вернуть байты к исходному значению, «трудно» восстановить анализ до предыдущего состояния. Отмена патча может иногда требовать дополнительных ручных исправлений.
При наличии времени и мотивации будущие работы могут включать:
xor eax, eax; ret;)Pretty: mov [rsp+48h+dwCreationDisposition], 3
Raw: mov [rsp+20h], 3
Я приветствую внешние вклады, сообщения об ошибках и запросы функций. Пожалуйста, делайте любые pull-запросы в ветку develop этого репозитория, если хотите, чтобы они были рассмотрены для будущего выпуска.