Еще раз об обфускации на основе виртуальных машин

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

  1. Epoch

    Epoch New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2011
    Сообщения:
    1
    Здравствуйте, друзья.
    Последнее время заинтересовался данным методом защиты, а точнее деобфускацией виртуализированных программ. Поэтому хотелось бы изложить некоторые соображения касательно того, какой мне видится стратегия реверсинга. Буду признателен если опытные реверсеры покомментируют.
    В первую очередь, конечно, нужно обнаружить факт обфускации виртуальной машиной. Тут, скорее работает интуиция больше, но некоторые признаки выделить можно:
    1. Обработка в цикле последовательности на первый взгляд "мусорных" байт (слов/двойных слов), которые в действительности являются байт кодом. Стоит посмотреть как обрабатывается один опкод, думаю часто наглядно видно, что путем сдвигов и логических опреаций из него выделяются отдельные элементы - код операции, операнды, префиксы и т.п.
    2. Предполагатю, что графы управления являются довольно ветвистыми, поскольку даже в очень простых ВМ необходимо употребить значительное количество switch-case'ов, условных переходов и циклов.
    3. Думаю, что в коде ВМ нет вызовов API и связей с невиртуализированной частью программы, точнее они есть, но являются косвенными, неявными. Иными словами он выглядит обособленно. Хотя не отрицаю, что туда можно накидать мусора;)

    Когда мы поняли, что имеем дело с виртуальной машиной, нужно определить контекст ВМ и понять как работает парсер байт кода. Контекст содержит регистры, возможно, стек, указатели на код и данные. При этом следует помнить, что ВМ может носить характер основанной на стеке или на регистрах. Может быть и смешанной, однако для реализации мне кажется это сложновато.
    Анализируя парсер, мы можем обобщать полученную информацию и детектировать структуры контекста виртуальной машины.
    К сожалению, не вижу более надежного способа понять работу ВМ кроме как декомпилировать её (вручную или с помощью декомпилятора). При этом, как мне кажется, функции парсинга очень похожи друг на друга и анализ упрощается со временем. Это очевидно, поскольку к каждому опкоду применяется одна и также процедура парсинга (опять же если это не какое-то экспериментальное "чудо").
    Вот такие нехитрые правила я для себя сформулировал, разминаясь на простых виртуалках. В частности на ESET'овских крякми и др. Не имел пока дела с vmprotect и themida, но судя по всему реверсинг этих ВМ является довольно сложной задачей для одного человека.
     
  2. Vam

    Vam New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2008
    Сообщения:
    149
    Epoch
    Здесь и здесь практически есть ответы на все твои вопросы.