Скажем, работаю над исполняемым файлом на протяжении 2-ух недель: переименовываю функции, определяю новые структуры, аргументы, устанавливаю для них типы, изменяю имена локальных переменных, устанавливаю ручные имена(когда жмешь ЛКМ на регистр, например, и потом Alt+F1) для символов, выставляю комментарии. В общей сложности делаю 2000 аннотаций. Теперь выходит новая версия программы. Есть Diaphora, но Diaphora позволяет перенести только имена функций и определенные структуры, а все другие вышеперечисленные аннотации - нет. Как быть? В книге Нарвахи рассматривались три плагина для BinDiffа: BinDiff, Turbodiff и Diaphora, но ни один из них не позволяет автоматически переносить все аннотации в новую базу данных. И в гугле ничего не могу найти. Второй случай: 2 человека работают над одной и той же версией исполняемого файла. Получается 2 базы данных. Теперь надо их объединить в одну базу данных. Третий случай: компилирую опенсорсную библиотеку с дебаг символами(с релизными флагами для компилятора), и теперь бы хотел иметь всю информацию из этой библиотеки в основной базе данных программы, над которой работаю в IDA. Во всех трех случаях частично справляется Diaphora, но в том-то и проблема, что только частично.
1. На ум приходит только сбор простеньким скриптом всех коментов и преобразование абсолютных адресов в смещение относительно начала именованной функции. Если эта диарея таки может детектить одни и те же фукнции и переносить имена, нету вообще проблемы за полчаса парой скриптов всё сделать. Это если функции подключены с либ, если компилер в новой версии их заново и по-своему откомпилил, не знаю что ты там собираешься переносить. 2. Объединяются базы для иды элементарно - экспортом одной из них в idc, либо экспортом обеих и ручным вдумчивым объединением содержимого скриптов. Не забудь повырезать из скрипта всё лишнее, оставив только расстановку коментов и имен. 3. То же самое что пункт один, опять же справедливо только прям для этой самой версии либы, иначе бесполезно.
При выходе новой версии те функции, которые я зареверсил и хочу перенести, не изменяются вообще, в основном. Обычно максимум что изменяется в функции так это оффсет структуры: mov eax, [ecx+58] изменяется на что-то вроде mov eax, [ecx+78] т.к. было добавлен член в класс и используется либо в новой функции, либо в какой-то другой функции, которой я не реверсил. А все блоки инструкций и сами инструкции остаются те же. Приведу пример. Есть программа: Спойлер Код (Text): #include <iostream> class HelloWorldPrinter { public: int Number = 94; void PrintHelloWorldPlusNumber() const { std::cout << "Hello World" << Number << std::endl; } }; int main() { HelloWorldPrinter helloWorldPrinter{}; helloWorldPrinter.PrintHelloWorldPlusNumber(); } Компилирую с дебаг символами и открываю в IDA. Далее переименовываю локальную переменную в helloWorldPrinter, добавляю комментарий eax is zero и через Alt+F1 даю имя регистру eax:Zero в той же инструкции: Спойлер Теперь открываю ту же программу в другой папке и без дебаг символов. Далее я делаю экспорт базы данных с символами в базу данных без символов при помощи Diaphora. На выходе в базе данных без символов получается вот так: Спойлер Как видно, Diaphora определила все идеально, просто не доделала работу: не переименовала переменную, которую я сам переименовал в базе данных с символами в helloWorldPrinter, а также не переименовала eax в eax:Zero, чтобы было как в базе с символами. Хотя, очевидно, что программа определила функцию и все символы правильно, ведь она определила большинство функций и переименовала их, и даже добавила комментарий eax is zero в той же инструкции. После того как тему создал, так и подумал, что надо будет свои скрипты написать для переноса символов внутри функций после порта Диафорой, ведь все что нужно уже есть: имена функции и их адреса в обеих базах. Потом добавить в Диафору, когда разберусь, как качественно переносить. Может показаться, что это не так уж и важно, но когда делаешь порт фреймворка, типа Qt. То разница между переносом всех символов и тем, что переносит Diaphora очень большая - это сотни тысяч дополнительных символов: комментарии, имена локальных переменных, типы локальных переменных и т.д. Да и свою работу при переходе на новую версию терять совсем не хочется.