понедельник, 23 декабря 2013 г.

Статический распаковщик для полиморфных пакеров

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

Напомню некоторые термины:

  • Полиморфизм - вид обфускации потока машинных инструкций целью которого является сохранение цели кода, но выразить другими машинными инструкциями.
  • Статический распаковщик - характеризуется тем что он не запускает исполняемый файл, а снимает его защиту используя знание о строении файла, работе стаба в упакованном файле
Статические распаковщики очень часто пишут антивирусные компании, что бы получить "чистый" не упакованный файл без его запуска.

Этапы:
  1. Инициализация
  2. Работа
  3. Завершение
Этап инициализации включает в себя:
  1. Открытие файла и создание нового выходного
  2. Сделать "первичную", т.е. быструю проверку файл. Т.е. минимальные требования к файлу : правильные: битность, архитектура, процессор, сигнатуры формата и т.д.
  3. Далее следует подготовить выходной файл. Здесь возможны две ситуации: 1) Стаб применяет алгоритмы сжатия и 2) Стаб не применяет алгоритмы сжатия. В случае первой ситуации нужно проделать процедуру "размаппить"(см. ниже). Во втором случае мы просто копируем входной в выходной
Под "размаппить" понимается приведение файла в такой вид, как будто бы мы только что сдампили файл, за тем лишь исключением что дампим мы обычно уже после настроенного импорта. Как правило, процесс "размаппить" выглядит так:
  1. Выходной файл размером в SizeOfImage байт наполняется нулями. 
  2. Затем в этот файл копируются заголовки
  3. Далее пробегаясь по описателям секций в файл записываются данные секций
Другими словами "размаппить" это частичная эмуляция системного загрузчика.

Этап работы включает в себя:
  1. Мы должны "пробежаться" потоку машинных инструкций и собрать статистику встречаемых инструкций.
  2. Попутно мы должны вычленить поведение интересующего нас потока полезных инструкций.
  3. На основании статистики встречаемых инструкций мы выносим вердикт "Это наш упаковщик"
  4. Если в п.3 вердикт положителен, мы на основании полученных в п.2 потоке машинных инструкций производим расшифровку
Этап завершения включает:
  1. Удаление стаба. К примеру наполнение байтом 0x90 области, которую он занимал.
  2. Задаем в заголовке значение новой точки входа

Писал для себя а то иногда забываю что-нибудь написать в коде. Если решили забрать себе в блог\журнал или еще куда ОБЯЗАТЕЛЬНО упомянуть автора,т.е. меня!

Комментариев нет: