воскресенье, 26 июля 2009 г.

Виртуальная машина в keygenme от Ms-Rem

Введение:

Те кто в теме, кто знает и слышал никнэйм Ms-Rem думаю слышали и о его детище-головоломке игрушке кейгенми цель, которого предоставить реверсеру офигенный навык по работе с виртуальными машинами. Итак все по порядку:


Цель кейгенми:
Разработать приложение которое на заданное имя пользователя сгенерирует последовательность цифр,называемую серийным номером. Введя эти данные в Edit'ы кейгенми получить "Congratiolations"

Уровни защиты:
1. Уровень защиты это небольшая и не сложная полиморфная паковка, снимаемая на глаз.
2. Алгоритм работы скрыт в командах придуманого разработаного интерпретатора этих команд, т.е.виртуальной машины.Именно в логике этих команд и скрыт механизм генерации фраз поздравления или посыла крякера, а также проверке введенных данных.

Краткое описание виртуальной машины:

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

Обозначения:

eax - выступает в роли указателя на команду
lpVMMem - указатель на виртуальную память
lpInput - указатель на введенные пользователем данные
lpOutput - указатель на то куда будет ложиться результирующая строка, о результате сверки, затем толи вас пошлют, либо поздравят )

Описание:

Размер виртуальной программы - 0x3DA2 байт!
  • 0 - увеличение на 1 численного значения указателя на виртуальную память
  • 1 - уменьшение на 1 численного значения указателя на виртуальную память
  • 2 - увеличение на 1 численного значения байта по указателю на виртуальную память
  • 3 - уменьшение на 1 численного значения байта по указателю на виртуальную память
  • 4 - копирование одного байти из входной последовательности в позицию виртуальной памяти куда указывает указатель на вирт. память. После увеличиваем на 1 указатель входных данных
  • 5 - копирование одного байта из вирт.памяти в память по указателю выходных данных. Затем увеличение на 1 указателя выходных данных
  • 6 - В случае если по указателю вирт. памяти хроанится 0, то вычисляется новое смещение и осуществляется переход
  • 7- В случае если по указателю вирт. памяти байт не равен 0, то вычисляется новое смещение и осуществляется переход

Выводы:

При просмотре кода вирт программы можно сделать выводы:
  1. Существует одна инструкция "5" значит и выполняется несколько роза, т.е. ЦИКЛ. Тоже самое с "4" !
  2. Из-за обилия инструкций "2" и двух "0" можно сделать вывод что это генерация юникод-строк с фразами результата в вирт. памяти.
  3. Нет проверки аналогично cmp в привычной нам хакерам свято верящих в x86-64 архитектуру и следовательно защита может только проверить какие-то байты введенных байт, командами "6" или "7"
  4. В силу. п3 защита может вычислеть такое значение значение указателя на вирт. память, где хранится строка с результатом!

Все! ;) Остается пожелать удачи тем, кто хочет попробовать силы и найти ответ на вопрос : "Как именно защита вычесляет значение указателя на строку с правильным результатом ?

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