wanted алгоритм поиска инлайн-функций в бинарном коде

Тема в разделе "WASM.RESEARCH", создана пользователем MrHammer, 5 фев 2006.

  1. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Пока видно только следующее:

    - парсинг С++ хидеров и перевод их в AST.

    - далее анализ на нестандартность и добавление найденных примет в базу данных.

    - когда д. видит, что идет манипуляция с экземпляром класса, проверяет инструкции на совпадение с приметами из базы данных( конвертация инструкций в примитвные инструкции ( типа risc ) и соответсвенно анализ ).

    Кто знает более эффективный путь, отзовитесь.
     
  2. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Хотя зачем анализировать инлайн-функции на какое-то приметы? Берем AST этой функции и сохраняем в базе данных д. Далее как описано свыше.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Твой метод поиска предполагает наличие сорцов? (хотя для общего случая всё равно не будет работать).

    Тогда в чём смысл декомпиляции? :)
     
  4. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Например, возьмем STL.Юзверьские функции в большинстве своем инлайны. Итак, мы скормили хидер д. и он нам создал AST инлайн-функций хидера. Д. в какой-то ф. находит экземпляр класса из того хидера. Соответсвенно трассирует все обращщения к этому экземпляру и узнает какие инструкции данной ф. связаны с этим экз. Смотрит в базе данных на наличие инлайнов у данного класса и находит их:derisive:))



    Вот здесь и возникает задача сравнить бинарный код и AST инлайн-функций.



    Очевидный путь - свести эти AST и помеченные инструкции к одинаковму типу данных и сравнить их. Более легким путем мне кажется перевести AST в прмежуточный код, чем инструкции переводить на AST.

    То есть переводим и машинные инструкции, и AST в 3-операндный код, оптимизируем их, потом сравниваем.

    Какие алгоритмы применить?
     
  5. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Могу поделиться опытом нахождения в бинарном коде, созданном компилятором Microsoft Visual C++ из С-кода (не С++ !!), так называемых intrinsic functions (к примеру, strlen, strcat, strcmp,... - список таких функций есть в Help). Если интересно, пиши на crypto2001@hotmail.ru.
     
  7. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    О да, volodya! То что надо. Единственное замечание, что в статье есть стремление использовать паттерн матчинг, что не есть гуд для структур, обладающих рекурсивной природой. Проще говоря, хотят использовать лексер, когда нужно воспользоваться бизоном. ТО же касается и для нахождения библиотечных функций. Рекурсивная природа савсем не учитывается во FLIRT. Ilfuk, с тебя пиво.
     
  8. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    crypto

    Дай угадаю, на что ты цепляешься при поиске таких функций - "rep" ? Угадал? Далее анализируем зависимость кода и проверяем на жестко вшитые совпадения. В любом случае, интересно. Пиши на limon-5_yandex.ru.
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    MrHammer



    Так ты говоришь о методах, а не о функциях вообще. Здесь действительно всё проще.

    Экземпляр класса найден, есть this pionter. Анализатор потока видит обращение к некоторому полю. Очевидно, что методы (к ним отношу здесь и friend'ы), которые к этому полю не обращаются, отсеиваются на этом этапе :derisive: Далее, смотрим какого рода обращение: чтение, запись, модификаци - отсеиваем ещё методы. Повторяем итерации. Здесь даже точная идентификация класса не требуется (а иначе как с шаблонами?), неподходящие кандидатуры отсеятся на одном из этапов анализа.



    ЗЫ Ты действительно уже так далеко зашел?
     
  10. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    crypto

    MrHammer



    Господа мои, пожалуйста, таких постов мне не надо. Забудьте о фразах "пиши на ..." и так далее. Это ФОРУМ и меня, как админа этого форума, в первую очередь, беспокоит ТОЛЬКО САМ ФОРУМ. А все остальное - дело двадцатое. Что я хотел этим сказать? Мыло в можете написать в профиле и, если кто-то захочет с вами соединиться, то он это сделает. А от всех этих бесполезных сообщений тут, пожалуйста, избавьтесь. Я сожалею, что у васма до сих пор нет ПМ, который избавил бы вас всех от таких проблем, но отсутствие ПМ не есть достаточный повод отказа от вежливости по отношению к форуму. Фух.
     
  11. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    S_T_A_S_

    Копаем потихоньку.

    volodya

    Ок.



    VC++ зверь. И оптимизация как у оружия - ничего лишнего.
     
  12. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Извините, господин ведущий! Вы абсолютно правы! Если мы будем так себя вести, то наш интеллектуальный клуб превратится в клуб для знакомств.

    ------------------------------------

    Видеокарта полетела, поэтому не мог поучаствовать в продолжении обсуждения.

    ------------------------------------

    MrHammer

    Дай угадаю, на что ты цепляешься при поиске таких функций - "rep" ?



    Для некоторых функций - угадал, конечно, это тривиально. Но к intrinsic функциям (их список, подчеркиваю, можно посмотреть в VC++) относятся и более сложные функции. Кроме того, не забывай, что оптимизатор вставляет в тело таких функций другие инструкции. Или использует значения регистров, полученные на предыдущих стадиях. Поясню на примере:



    test eax, eax

    jnz @1

    mov ecx, 0FFFFFFFFh

    lea edi, [String]

    repe scasb

    ...



    В этом примере неявно задано значение al=0 для поиска конца строки.



    Инструкции в теле функции могут быть переставлены. Ну и, наконец, в некоторых случаях могут использоваться разные наборы регистров.

    Например, в одном случае могут использоваться региcтры ah, bh, ch, а в другом - ah, bh, dh.



    Я сей момент не готов выложить код для изучения, но на неделе постараюсь это сделать.
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    В приаттаченном файле я выложил фрагмент из модуля препроцессора декомпилятора С, который сканирует исходный код (в этой версии - текстовый дизассемблированный файл, полученный в IDA) для нахождения intrinsic-функции strcmp. Я не буду вдаваться в подробности, здесь главное - идея протаскивания многовариантного шаблона с учетом наличия вставок, сделанных оптимизатором. Код написан на Билдере.

    [​IMG] _422426532__strcmp_preprocessing.txt
     
  14. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Большое спасибо, crypto!

    Некоторые заметки. На уровне абсракции как д. нет понятия регистр. Спаренные оптимизированные инструкции не должны влиять на ход д., так как он манипулирует только деревьями ( CFG, AST etc). И проблема перестановки инструкции на таком уровне просто не существует.

    Например, данный код:



    test eax, eax

    jnz @1

    mov ecx, 0FFFFFFFFh

    lea edi, [String]

    repe scasb



    Будет иметь примерно след. структуру



    BBlock1

    {

    ...

    RelExpr(Op1, ZERO, EQ);

    CFlow(@1, NE);

    }

    BBlock2

    {

    Assignment(ecx,0xFFFFFFFF);

    Reference(edi, String);

    CallStatement(REPE_SCASB, edi, ecx, direction );

    }
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Ну да, для такого варианта у меня не возникало затруднений. Может, пример неудачный привел. Понятно, что все решается эмуляцией. :)

    Ты декомпилятор Визуального Мелкософтовского С пишешь? Крутая штучка. У меня идейки на этот счет есть (именно для Визуального Мелкософтовского С)...
     
  16. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Приветец, crypto. MSVC++ согласен крутая штючка. Если д. умеет брать бинарники сгенерированные данным компилером, то можно считать, что он возьмет бинари и от Бормана, и от Ватком иже с Гну.

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

    reverser New Member

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

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    reverser

    Собственно приведенный мною код эти паттерны и находит, заменяя их вызовами intrinsic функций. Идея не новая, согласен, но я могу находить паттерны с вкраплениями, которые делают некоторые компиляторы с целью оптимизации конвейерной обработки инструкций.
     
  19. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    MrHammer

    можно считать, что он возьмет бинари и от Бормана, и от Ватком иже с Гну

    Насчет Борланда - сомневаюсь, структура программы сильно отличается от кода, сгенеренного Visual C++ или Watcom, насчет Гну не скажу, еще не изучал. К Борланду нужен отдельный подход.
     
  20. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    MrHammer

    Но если рассматривать задачу декомпиляции конкретной процедуры, то наверное ты близок к истине.