Как перенести всю работу в базу данных над обновленным exe'шником?

Тема в разделе "WASM.BEGINNERS", создана пользователем Kulagin, 23 дек 2021.

  1. Kulagin

    Kulagin New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2020
    Сообщения:
    8
    Скажем, работаю над исполняемым файлом на протяжении 2-ух недель: переименовываю функции, определяю новые структуры, аргументы, устанавливаю для них типы, изменяю имена локальных переменных, устанавливаю ручные имена(когда жмешь ЛКМ на регистр, например, и потом Alt+F1) для символов, выставляю комментарии. В общей сложности делаю 2000 аннотаций.

    Теперь выходит новая версия программы. Есть Diaphora, но Diaphora позволяет перенести только имена функций и определенные структуры, а все другие вышеперечисленные аннотации - нет.

    Как быть? В книге Нарвахи рассматривались три плагина для BinDiffа: BinDiff, Turbodiff и Diaphora, но ни один из них не позволяет автоматически переносить все аннотации в новую базу данных. И в гугле ничего не могу найти.

    Второй случай: 2 человека работают над одной и той же версией исполняемого файла. Получается 2 базы данных. Теперь надо их объединить в одну базу данных.

    Третий случай: компилирую опенсорсную библиотеку с дебаг символами(с релизными флагами для компилятора), и теперь бы хотел иметь всю информацию из этой библиотеки в основной базе данных программы, над которой работаю в IDA.

    Во всех трех случаях частично справляется Diaphora, но в том-то и проблема, что только частично.
     
    Последнее редактирование: 24 дек 2021
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.955
    1. На ум приходит только сбор простеньким скриптом всех коментов и преобразование абсолютных адресов в смещение относительно начала именованной функции. Если эта диарея таки может детектить одни и те же фукнции и переносить имена, нету вообще проблемы за полчаса парой скриптов всё сделать. Это если функции подключены с либ, если компилер в новой версии их заново и по-своему откомпилил, не знаю что ты там собираешься переносить.
    2. Объединяются базы для иды элементарно - экспортом одной из них в idc, либо экспортом обеих и ручным вдумчивым объединением содержимого скриптов. Не забудь повырезать из скрипта всё лишнее, оставив только расстановку коментов и имен.
    3. То же самое что пункт один, опять же справедливо только прям для этой самой версии либы, иначе бесполезно.
     
    Последнее редактирование: 24 дек 2021
    Kulagin нравится это.
  3. Kulagin

    Kulagin New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2020
    Сообщения:
    8
    При выходе новой версии те функции, которые я зареверсил и хочу перенести, не изменяются вообще, в основном.
    Обычно максимум что изменяется в функции так это оффсет структуры: mov eax, [ecx+58] изменяется на что-то вроде mov eax, [ecx+78] т.к. было добавлен член в класс и используется либо в новой функции, либо в какой-то другой функции, которой я не реверсил.
    А все блоки инструкций и сами инструкции остаются те же. Приведу пример. Есть программа:
    Код (Text):
    1. #include <iostream>
    2. class HelloWorldPrinter {
    3. public:
    4.     int Number = 94;
    5.     void PrintHelloWorldPlusNumber() const {
    6.         std::cout << "Hello World" << Number << std::endl;
    7.     }
    8. };
    9. int main() {
    10.     HelloWorldPrinter helloWorldPrinter{};
    11.     helloWorldPrinter.PrintHelloWorldPlusNumber();
    12. }

    Компилирую с дебаг символами и открываю в IDA. Далее переименовываю локальную переменную в helloWorldPrinter, добавляю комментарий eax is zero и через Alt+F1 даю имя регистру eax:Zero в той же инструкции:
    [​IMG]

    Теперь открываю ту же программу в другой папке и без дебаг символов. Далее я делаю экспорт базы данных с символами в базу данных без символов при помощи Diaphora. На выходе в базе данных без символов получается вот так:
    [​IMG]

    Как видно, Diaphora определила все идеально, просто не доделала работу: не переименовала переменную, которую я сам переименовал в базе данных с символами в helloWorldPrinter, а также не переименовала eax в eax:Zero, чтобы было как в базе с символами. Хотя, очевидно, что программа определила функцию и все символы правильно, ведь она определила большинство функций и переименовала их, и даже добавила комментарий eax is zero в той же инструкции.

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

    Может показаться, что это не так уж и важно, но когда делаешь порт фреймворка, типа Qt. То разница между переносом всех символов и тем, что переносит Diaphora очень большая - это сотни тысяч дополнительных символов: комментарии, имена локальных переменных, типы локальных переменных и т.д.

    Да и свою работу при переходе на новую версию терять совсем не хочется.
     
    Последнее редактирование: 24 дек 2021