IDA Pro: реконструирование

Тема в разделе "WASM.RESEARCH", создана пользователем dv66, 25 мар 2009.

  1. dv66

    dv66 New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2009
    Сообщения:
    8
    Можно ли в ида где-то сбоку хранить реконструкцию исходного кода?

    Занялся я тут недавно реконструированием одной программы (и реконструированием вообще) и столкнулся с тем, что очень неудобно "восстановленные" исходники хранить отдельно от дизасма. Т.е. сейчас я создаю файл, что-то типа 004ABDC0_readFrom.cpp, в который пишу реинженернутый код, но т.к. постоянно появляется новая информация о типах, структурах и т.п. то получается нужно заново проходиться по файлам и их обновлять.

    Вот хотелось бы узнать, можно ли этот восстановленный код как-то привязывать к дизасму? В идеале, чтобы получилось что-то похожее на source+disasm в отладчиках :)
    В худшем случае, чтобы просто глядя на дизасм функции можно было бы легко перейти к её сишному представлению и подредактировать/подсмотреть.
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
  3. dv66

    dv66 New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2009
    Сообщения:
    8
    Зачем мне декомпилятор? Я сам восстанавливаю код, но, к сожалению, пока что приходится его писать в отдельные файлы.
    Hexrays создаёт readonly текст, который править нельзя. Во всяком случае я не нашёл как.
     
  4. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Зато он отлично учитывает информацию о типах при её наличии.
     
  5. dv66

    dv66 New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2009
    Сообщения:
    8
    Это да, уже заметил.
    Даже освоил __usercall :)

    Но всё же, вопрос остаётся открытым: можно ли своё что-то подписывать/дописывать?
     
  6. Vam

    Vam New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2008
    Сообщения:
    149
    dv66
    Кроме комментариев ничего в Иду нужного не допишешь. Это не относится к структурам (классам, объединениям) и перечислениям.
    Могу поделиться опытом по реверсингу, т.к. более 10 лет занимаюсь этой проблемой и мной восстановлено порядка 10 исходников программ разной степени сложности, включая и современные игровые графические движки.
    1. Определяем на каком языке и какими средствами создана программа. Восстановливаем исходники (отлаживаем) только на этом языке и этими же средствами. Предположим, это VS6 MFC, далее по тексту просто VS.
    2. Пишем исходники (по мере разбора в Ида) напрямую в VS, предварительно создав нужный тип проекта.
    3. Для частичной отладки некоторых функций делаем "заглушки" и ставим их на неполностью восстановленные функции (что-то пока непонятно) или на вызовы ненаписанных функций. Заглушка представляет из себя что-то следующее
    Код (Text):
    1.     MessageBox(GetFocus(), "zCFont::AnalyseLetters not full", "Error-Message", 0x40000);
    2.     exit(1);
    В обычных случаях работает, в сложных сучаях (в исключениях, некоторых потоках) легко модифицируется к нужному виду.
    Основное назначение - запрет выполнения или пропуск кода, который ещё не написан и извещение о том, какую функцию надо восстанавливать дальше для продолжения отладки.
    И таким робразом, шаг за шагом, идем до конца.
    Да, классы добавляем (расширяем) в Ида и параллельно в исходниках, имена членам классов на этом этапе советую давать такие xx134, где xx - может быть любой буквой, какая нравится (я выбрал - s), а 134 - смещение члена от начала класса в hex. В дальнейшем такие имена заменяются на осмысленные.

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

    dv66 New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2009
    Сообщения:
    8
    Vam
    Большое спасибо, видимо я был на правильном пути :) Только я файлы не добавлял в проект, но теперь так и сделаю, т.к. их количество растёт, как на дрожжах и навигация затрудняется.