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

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

  1. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    Для этого и используют "бинарный" (или двоичный) метод анализа. В течении анализа вы как бы делите исследуемый в данный момент блок на две (не обязательно равные) части и смотрите в какой есть отличия. Это не так быстро как "сравнение двух трасс" но приемлимо быстро потому как это тоже типа ~ log2(N).

    На самом деле вам анализ двух логов не нужен. Предположим что вы построили два лога (с помощью своего скрипта, с помощью эмулятора-плагина, с помощью лога windbg...) и даже быстро научились в каком-нить редакторе смотреть diff. Допустим что вы нашли такое место:

    Код (Text):
    1. ... ; Выше все команды идентичны для тестового и верного файлов
    2. call SomeSub22
    3. cmp [edi+58h],eax
    4. jnz  @@SomeLabel22 ; Туда уходит для тестового файла
    5. ; Здесь же продолжаецца для обычного файла
    Что же далее? А далее нужно заходить в SomeSub22 в дизассемблере (IDA/etc) и уже там, после анализа которому трассы не помогут, вы выясните что SomeSub22 это на самом деле int CRC32Inv(void *buf, int bufsz, int CRCIn).

    Да, трассирование может помочь но в данном случае основная трудоемкость - именно статический анализ обычного C-кода которого много. Анализируя множесто процедур вы начинаете постепенно понимать как это все работает в то время как trace&compare может вам максимум что дать - это быстрее указать где же различия в выполнении.
     
  2. mrCyber

    mrCyber New Member

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

    Все так и есть.
    Дело в том, что я достаточно полно представляю, на ск. сложен формат и сколько нужно кода для работы с ним. Хотя бы потому, что я сам этот код, или какую-то его часть, уже написал.
    Там неизбежно есть рекурсии (ибо дофига деревьев), куча проверок и ветвлений.
    Понимая это я не рассчитываю на постепенное понимание всего кода. Это утопично, то есть не случится в сроки, приемлемые для заказчика.
    Значит мне надо найти конкретное место, локализовать участок, где принимается решение, происходит развилка. И уж там, в окрестностях этого кода мне придется делать все то, что вы и описали - терпеливое понимание С-кода.
     
  3. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    Найти первое место где начинается реальный парсенг файла (это действительно занимает некоторое время) можно намного проще: CreateFileA (отладчег, апи логгер) -> чтение вашего файла -> бряк на прочтенный буфер -> 1-4 бряка на память после ReadFile (может копировацца из буфера в буфер) - bpm/hardware breakpoint в Olly -> все (от 10 минут до 5 часов).

    После того, как найдена первое место парсенга все остальное уже рядом. Причем скорее всего у вас сначала будет обнаружена какая-то мелкая ошибка формата (и вы ее быстро исправите, ога), но далее уже будут идти ошибки более высокого порядка и тут уже без частичного анализа вряд ли.
     
  4. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    Да, все так. Это уже давно сделано.
    Кстати, как ни странно, но брэйк на CreateFileA не сработал..... То ли я делаю что-то не так......
    Но иначе то файл никак не открыть.
    А чтения/записи видно все.
    Ладно - будут результаты/вопросы - вернусь сюда.
    Спасибо!
     
  5. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    CreateFileW
     
  6. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    В PSExplorer есть закладка Stack, где как правило видно стек процедур, вызвавших чтени-запись-итд.
     
  7. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Да заплати ты Сквош, не жадничай, она ведь уже делала эту работу, зачем повторять её. Современная концепция программирования звучит как :"Программировать надо так, чтобы по-меньше программировать". Ты в результате получаешь почет руководства и трепетный шопот за спиной:"Смотрите, смотрите это тот самый который за два дня решил...", а сквош получает мотоцикл...
    А то она сканировать энмапом может как Тринити, а мотоцикла Дукатти у неё нету- бардак согласись?
     
  8. mrCyber

    mrCyber New Member

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

    Мацатыкл значит хотите, да?
     
  9. _Juicy

    _Juicy Active Member

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

    Вы слишком трепетно относитесь к своему образу. По большому счету всем... все равно :)
     
  10. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Что есть "развилка" ?

    В IA разрыв графа на ветви это просто вершина графа, тоесть есть некоторое число ветвей, описанное в инструкции. Каким тут боком какой то софт(у меня не хватило терпения прочитать сабж) ?
     
  11. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    чел уверен что найдет 74 заменит на eb и все сразу запоет ... ну может со второго раза :)
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    z0mailbox
    Или читайте тему или не пишите глупости. Под развилкой подразумевалась развилка в алгоритме. На правильном файле он идет по одной ветке, на неправильном по другой.
    А править надо прогу, которая пишет файл.
    Если есть действительно знание формата именно структурно, то анализ должен быть прост. Находим развилку, смотрим принадлежность байта в структуре и ДУМАЕМ, где ошиблись в понимании. 200 страниц это да. Нужно рисовать графы и почее.
    НО!!! Основная трудность как я себе представляю, что правильный и неправильный файл РАЗЛИЧНЫ по содержимому и естественно по разному обрабатываются сканером. И искать развилки БЕСПОЛЕЗНО. А надо с помощью своей библиотеки построить ФАЙЛ ИДЕНТИЧНЫЙ по смыслу правильному, например ПУСТОЙ или с одним письмом/документом. И сравнивать до опупения почему они не совпадают и ЧИТАТЬ ФОРМАТ до дыр.

    Либо действительно реверсить сканер, а это ТЯЖЕЛО.
     
  13. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    я читаю и кое-что даже понимаю
    и даже знаю откуда это вылезло - "ищу развилку"
    в тупых защитах это сразу после вызова функции BOOL IsProtected(void)
    смеюсь я лишь над тем что здесь НЕ защита
    здесь речь идет о понимании сложного недокументированного формата (немного имел с ним конкретным дело)
    какая в анус развилка! бред
    без тщательного реверса тут никак
     
  14. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    Valterg - жму вам руку. Вы на самом деле все предельно правильно поняли.
    Тема долгая и я не в состоянии все факты одним махом здесь вывалить. Да это и неразумно - никто мой пост до конца просто не дочитает.
    С одной стороны да, я понимаю, что алгоритм сканера достаточно сложен. И это меня удерживает от полного реверса. К тому же я тут новичок и надо требуеоме время/усилия/деньги_заказчика/терпение_заказчика помножить хер его знает на сколько раз.

    Да, я бы мог сказать заказчику, что задача нерешаема, Но тогда
    1. я бы соврал
    2. подвел бы Хороших людей, с кот. сложились отличные отношения
    3. похерил бы неск. месяцев своей работы
    4. потерял бы неплохой доход и все же интересную работу


    При этом у меня на руках есть вот какие факты:

    1. есть некая утилита (http://pstviewtool.codeplex.com/documentation)
    которую в свое время писал сотрудник M$. Этот же самый человек был в команде по разработке софта для Outlook. Сейчас он ушел в другую компанию. В связи с чем прекратил свои работы надо всем этим. Но он готов отвечать на конкр. вопросы и делать он это готов на stackoverflow.com. Я бы тоже рад задать ему конкретный вопрос. Но конкретного вопроса у меня как раз нет. Осознание сложности ситуации не позволяет мне задать человеку вопрос "а что в моем коде не так". Мне ответят сразу - что самое страшное "не так" у меня в ДНК.
    Так вот эта утилита читает мой файл и правильный - совершенно корректно, нормально, без ошибок. Мой пустой файл и файл, созданный в аутлуке - в глазах этой утилиты выглядят с логической точки зрения абс. одинаково. И мой файл открывается и корректен со всех сторон.

    2. Я достаточно хорошо понимаю, как устроен этот формат. Также я вижу, где, на каком этапе этой длинной цепочки (я про процедуру сканирования) все рушится. И рушится все где-то в самом начале. Другое дело - какой длинны это начало - тысяча инструкций или миллион. Но это еще один довод в пользу того, что найти все же место, где алгоритм разветвляется - можно. Можно - в смысле в разумные сроки.

    3. Да, вы правы - что надо еще и еще читать спецификацию, пока не случится прозрение. НО!...... Я не могу на сто процентов быть уверенным, что спецификация ПОЛНА, Актуальная и честна..... Увы. Я не вижу ни единого мотива, почему бы M$ были бы заинтересованы в раскрытии всех своих карт....... НО!!!! Но даже если в моих руках абс. полная спецификация, то есть еще одна мысль, подброшенная тем самым разработчиком, о кот. я упоминал выше. А именно: "спецификация ПСТ файла - это просто спецификация формата файла. А вот как с этим файлом работает аутлук - это Совсем Другая История".... И тут он, к сожалению, абсолютно прав. Так что читать спеки до полного прозрения - увы, в данном случае не канает :dntknw:(

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

    Есть сугубо практический вопрос.
    Как заставить IDA Pro не валить в трэйсы инструкции конкретной библиотеки, например ntdll и kernel32??

    Еще я заметил, что трэйс на определенных инструкциях может обрываться (похоже это переходы). Если их прошагать и запустить трэйс дальше - все заиграет. В чем фокус? Как это обойти?

    СПАСИБО!
     
  15. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    mrCyber, аутлук может открывать и читать ваши файлы?
    Давайте на zalil.ru ваш файл и мне в личку ссылку, найду вам вашу развилку.
     
  16. mrCyber

    mrCyber New Member

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

    :) Ок.... давайте попробуем.
     
  17. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Вот теперь ясно стало. Т.е. scanpst не находит криминала, а Outlook находит? Надеюсь Squash вам поможет :)
     
  18. mrCyber

    mrCyber New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2011
    Сообщения:
    42
    Нет.
    Все хуже.
    Аутлук отказывается совсем.
    СканПст начинает и практ. сразу вылетает с собщением "работа прервана из-за найденных проблем, файл остался немодифицированным". И все.
     
  19. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    На мой взгляд, слишком много слов говорите. Не надо так. Лаконичней. Иначе народ запутывается. Вот ключ, который я отрыл из ваших сообщений.
    Стратегия должна быть такой:
    1) нужно создать как можно маленький файл который правильный.
    2) Затем нужно создать ваш файл максимально приближенный к правильному.
    Не надо все реализовывать. Только минимальное. С этого нужно начинать. Прежде чем рыть код, сначала нужно сделать то, что можно обычными средствами.
     
  20. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Далее, создайте не пустой файл, а с минимальной инфой, но виндовскими средствами. Сравните пустой и тот который
    уже содержит, что-то. Вы можете очень много почерпнуть из этого не вникая в код.
    Далее медленно переходите к такому файлу, который вам реально нужен, т.е. тот который будет содержать нужную вам инфу. Затем просто в этот файл сможете уже вставлять нужные вам данные. И никакого реверса не нужно будет. Я бы сделал так, поскольку ленив очень. :)