Загрузка...

Плагин PatchDiffCorrelator: эффективно коррелируем функции в ghidra

Тема в разделе Софт создана пользователем LockBit 8 июн 2025 в 06:14. 68 просмотров

Загрузка...
  1. LockBit
    LockBit Автор темы 8 июн 2025 в 06:14
    для эффективного сопоставления одних и тех же / изменённых (а так-же новых/удалённых) функций в двух разных версиях программы, дизассемблер ghidra использует утилиту Version Tracking.

    её работа основана на алгоритмах корреляции (далее корреляторы) - алгоритмах, которые сравнивают функции тем или иным образом.
    коэффицент "совпадения" функций называется Score, в нашем случае он имеет значения от 0 до 1.0, где 0 означает, что функция не имеет пары (была добавлена или удалена в новой версии), а 1.0 - полное совпадение функций, когда коррелятор сопоставил две функции и не обнаружил между ними никаких отличий.

    patch diff - техника, подразумевающая отсев идентичных функций и проверку изменённых, в основном для того, чтобы определить и понять, какие изменения были внесены в программу в новой версии.

    базовый набор корреляторов ghidra ограничен банальными алгоритмами, которые:
    - находят и сопоставляют функции по их инструкциям (Score от 0.95 до 1.0)
    - находят и сопоставляют функции по их мнемонике (Score от 0.95 до 1.0)
    - находят и сопоставляют функции по их байтам (Score от 0.95 до 1.0)
    - находят уникальные функции в старой и новой версии (Score 0)
    - находят дубликаты функций и данных (Score 1.0)
    - находят и сопоставляют функции по символьным именам, если вдруг какая-либо из версий программы их содержит (Score 1.0)
    после применения базовых корреляторов ghidra, результат Score колеблется в диапазонах от 0 до 0 и от 0.95 до 1.0, то есть текущие алгоритмы совершенно не предназначены для patch diff, т.к. их алгоритмы не способны выявлять функции со значительными изменениями.

    на помощь приходит плагин, реализующий дополнительные корреляторы, которые позволяют обнаружить такие функции.
    он добавляет дополнительные корреляторы, способные находить функции со значительными изменениями.

    как использовать плагин?
    для начала, воспользуемся базовыми корреляторами, нацеленными на поиск идентичных функций (Score 1.0).
    затем, после того как мы обнаружили совпадения, одобряем их - Select all -> Accept.
    после чего воспользуемся дополнительным коррелятором с флажком "Only match accepted matches" (чтобы плагин не пытался найти взаимосвязь между функциями, которые никак не похожи друг на друга), для примера пусть это будет Bulk Basic Block Mnemonics Match Correlator - данный алгоритм сравнивает отдельные части функций (блоки), сопоставляя их друг с другом, игнорируя пропущенные/добавленные блоки - таким образом мы можем обнаружить изменённые функции, где добавлена/удалена какая-то проверка, условие (if), часть кода и так далее.

    бинго - мы получили список функций, пригодных для patch diff.

    репозиторий данного плагина не обновлялся целых шесть лет:
    - последняя версия плагина собрана под ghidra версии 9.1 / 9.1.2.


    я обновил для вас данный плагин под актуальную версию гидры (11.2.1).
    из изменений в новой версии:
    1. исправлена ошибка, из-за которой невозможно воспользоваться плагином на актуальной версии ghidra
    [IMG]
    2. исправлена ошибка сборки, вызванная системой валидации и сборки Help File.
    https://github.com/threatrack/ghidra-patchdiff-correlator/pull/4/commits/38eaa377d85c8b21f2c17a1b0c7d854cdd2034dc

    убедившись в работоспособности данной версии плагина,
    [IMG]
    выкладываю ссылку на скачивание:
    сборка плагина под ghidra 11.2.1 (вместе с исходным кодом)
     
    8 июн 2025 в 06:14 Изменено
  2. virtualhost
Top