Знатокам реверса - развилка в коде - как найти???

Тема в разделе "WASM.RESEARCH", создана пользователем mrCyber, 19 янв 2012.

  1. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    mrCyber

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

    OpenInFile(...);
    ... // Do something;
    ReadData(offset, size...)
    ... // May be first checks, may be full file CRC
    ReadData(offset, size...)
    ...
    CloneInFile(...)

    Вы реверсировали грубо первые четыре точки на основании верного файла. Теперь суете ваш и смотрите проходит ли он так же точно их? Допустим что второй ReadData не прошел и он сразу ушел на создание временного файла (это общая методика - например так же Excel делает) - теперь нужно искать где это произошло и почему. Те "бинарный поиск".

    Трудозатраты около двух недель или меньше.

    PS Алгоритмы и опейсания от MS - это как правильно "множество информации кроме той, которая нужна".
    PPS Полезно также реверсировать функцию логгирования ошибок или по крайней мере найти ее.
    PPPS Полезно подгрузить в IDA все related-структуры и пытаться найти в коде использование. Например:

    tInputFile
    {
    ULONG FileSize;
    int hFile;
    ULONG CRC32;
    ...

    Все ссылки вида [edi+8] теперь кандидаты для [edi].CRC32.
     
  2. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    БОЛЬШОЕ Спасибо!

    Я с идой знаком пару недель.... Так что далеко не все знаю, что и как в ней можно делать.

    Что скажете про язык в нее встроенный? На что он способен? Что можно в моем случае реализовать с пом него?

    Как можно пройти пошагово по всему коду и все условные переходы - их адреса и был/не_был переход - залогировать в текстовый файл. Это возможно?
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    mrCyber
    Попробуй сам автоматизировать.
    Суть такова устанавливаешь seh обработчик в потоке и ловля исключения можно исполнять по одной инструкции там ты сможешь создать список/граф работы алгоритма на одних данных.
    Аналогично сделать и для других файлов.
    Ну и сравнить в итоге.

    Сам на практике еще не проверял, нету времени чтоб проверить на сколько это действенно.
    Но в теории вроде все хорошо должно быть, особенно если алгоритм одно поточный.
     
  4. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    Годно! отпилить все лишнее, она особо не сопротивляется, куда быстрее чем писать своё по листингам.
    хотя.. зависит от задачи и объёмов нужного кода.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    mrCyber
    Дык лог трассировки это как раз последовательность реально выполненнных комманд и если в соседних окнах любого текстового редактора открыть два лога и синхронно листать их то развилку увидишь легко и не особо вглядываясь ибо после неё эта синхронность резко нарушится. К тому же запускать трассировку есно лучше не с начала проги а с точки ранее найденной и уже поправленной развилки. Это как раз самый простой способ искать "вилки", раз уж ты решил их искать.
     
  6. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    mrCyber
    На всякий случай - вам же не только создавать, но и работать с ним, верно? Иначе логично было бы сделать пустой шаблон и носить его с собой.
    С какой версией аутлук(сканпст) работаете? С какой версией формата?
     
  7. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    Да, конечно. Мне надо уметь его полностью строить.

    Версия формата - это очень тонкий вопрос. Скажу так - последний. Ибо сам до конца не понимаю, какие там есть версии формата. Мне нужно работать с тем, с чем умеет работать Outlook 2007/2010. Я озадачил тем же вопросом людей на форуме сапорта M$.... Полный атас :dntknw: Какой-то бред и чушь в ответ. Сказать кроме того, что есть на страницах MSDN или в спецификации - так ничего и не смогли. Начал с ними переписку еще пару месяцев назад. Сейчас понимаю, что это была пустая трата времени.
    Было бы странно, если бы они начали говорить, что и как есть на самом деле. Им это не то, что ненужно, а крайне невыгодно.

    Зато удалось выйти на связь с одним из членов команды, разрабатывавшей все это хозяйство и много знающего и писавшего, когда работал в M$, под и про .PST. Он реально готов отвечать на вполне конкретные вопросы - на стэкОверфлоу. Но мне сложно задать конкретный вопрос.... Спросить "что у меня в коде не так" - будет выглядеть как признание в кретинизме.
     
  8. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Пожалуй, для начала посоветую вам оставить пока scanpst.exe и заняться mspst32.dll - процедурой создания файла.
    Также можно взять пару пст, созданных аутлуком и созданный вами и посмотреть, в чем сходства и отличия.

    На вопрос "как правильно создать пстшник и как с ним работать" он тоже отвечать не хочет?
     
  9. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    ...... эээээээээээ........... Вы это не пошутили? :)

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

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

    А вы бы стали отвечать на такой вопрос???

    Я - нет. Это полный бред.
    Только одна спецификация занимает 200 страниц. Я ее раскуривал неск. месяцев. Да, сейчас я там все понимаю. От и до.
    Чтобы ответить на такой вопрос - надо садиться рядом и смотреть на код.... в теч. долгих ночей.

    Иначе.... как иначе???

    Это все равно, что спросить "а как писать клевые программы?"....... ну и по ходу "а как быстро стать крутым хакером".
     
  10. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    От создания пустого файла? М.б.

    Это ваша точка зрения. Имхо, форум стерпит все %)

    Если мне знаком формат - отчего бы не ответить? Заголовок, структура, принципы работы...
    Ну, вам решать, насколько вам нужны эти сведения и на что вы готовы ради них :lol:
     
  11. samuraishowdown

    samuraishowdown New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    70
    Твоя задача 100% решаема. Сначала, засекаешь момент, когда файл уже прочитан в память, но с этой памятью не производились никакие манипуляции. Сделать можно с помощью ProcessMonitor. Настраиваешь фильтр на чтение своего файла. После прочтения первого блока (а ProcessMonitor даже количество прочитанных байт покажет) смотришь backtrace стека. Там увидешь адреса на которые надо ставить бряк.
    Ну а дальше просто - от бряка трейсишь (трассу записывать в файл), сначала без захода в функи. Потом берёшь файлы с трассами и сравниваешь например в WinMerge. Потом трейсишь с заходом в функу, после которой пошло различие - и так пока не доберёшься до правды.

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

    Ну а так вариантов ещё можно придумать, было бы желание.
     
  12. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    СПАСИБО!...
    На самом деле вариантов не так уж много. Да мне и одного бы хватило - главное, чтобы помогло.

    Момент чтения я и так вижу (брэйк на ReadFile - о чем я уже писал здесь). Их много - файл читается кусками. Что вполне логично - согласно его внутр. логике.

    Ловить все обращения к прочитанномку куску в памяти - бесполезно. Их слишком много.
    Я думаю нужна трасса всех условных переходов. И потом сравнить две трассы. Как записать в лог только условные переходы???
    И не так, чтобы я сидел давил миллион раз F8, а автоматом.
     
  13. maverick

    maverick New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2008
    Сообщения:
    148
    На медицинском форуме эта тема называлась бы "Как удалить гланды через задницу"...
     
  14. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    Допустим.
    Тогда расскажите, как бы вы удаляли эти гланды.
    Мне интересны сейчас любые разумные идеи.
     
  15. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    тебе же Y_Mur сказал, чё исчо добавить?
     
  16. maverick

    maverick New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2008
    Сообщения:
    148
    Squash уже Вам все расписала. То, что хотите Вы, расписали остальные участники треда. Выбирайте...
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    mrCyber
    Трассирока и так пишет всё "автоматом", не путай её с пошаговым режимом.

    Записать всё подряд потом сделать выборку, например UltraEdit 32 умеет составлять список строк содержащих искомые подстроки, впрочем и своя прога делающая такую выборку делается легко, только это не нужно - сравнивая логи ты и так беглым взглядом увижишь где они одинаковы, а с какого места расходятся.
     
  18. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    Да, я вижу, читаю. Не на все успеваю ответить или не на все нахожу, что ответить.

    Кстати, пока никто ничего не сказал по поводу того, что можно выжать, получить из языка, встроенного в иду. Неужели такое мощное средство в моем случае абс. бесполезно?
     
  19. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    Спасибо! Это и сделаю в ближ. время.
     
  20. samuraishowdown

    samuraishowdown New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    70
    mrCyber
    Это вам от неопытности так кажется.

    Предполагаем (а не 100% что так и будет) - обработка прочитанного файла начинается с 1 байта и вся обработка происходит в одном потоке. Ставим железный бряк на чтение этого байта. Трейсим от чтения этого байта (чтобы не жмакать ф8 осваиваем команды отладчика. Например для windbg "p 1000" - трасса без захода в функи 1000 инструкций - уже бы палец смазолил). И сравниваем трассы, надеюсь тоже не вручную.

    Трейсы только условных переходов - такое возможно со всякими костылями типа paimei или хз как оно называется (но помоему оно того не стоит).