October 15

Обзор на малоизвестный протектор Alienyze Protector v1.4

На просторах интернета я случайно наткнулся на малоизвестный и очень интересный протектор под названием Alienyze Protector v1.4 (официальный сайт), который продавался за 49$, описание было очень интересным, но малоговорящим:

  • Anti-Debugger techniques that detect and fool present debuggers
  • Anti-VM techniques that detect sandbox & virtualized environments
  • Protection from disassemblers and software analysis tools
  • Hardware ID locking for making applications machine dependant
  • Integrity checks that detect code patching & tampering
  • Customizable compression and encryption of the applications code
  • Real time protection in running application
  • Project configuration settings Load, Save support
  • Multilingual user interface, language selection support
  • Command line support
  • And many more

Превью

Я скачал демо-версию, чтобы посмотреть, что он из себя представляет. В описании не написано, но я скажу, что в демо-версии скорее всего присутствуют полноценные функции "Anti-Debugger", "Anti-VM", "Protection from disassemblers and software analysis tools", "Integrity checks that detect code patching & tampering" и "Real time protection in running application", то есть все самые важные нам функции, которые нужны для обзора протектора.

Первый взгляд

Скачав демо-версию протектора, перед глазами появился достаточно обычный но приятный интерфейс:

Интерфейс протектора

Доступный функционал следующий:

Функционал протектора

Написав тестовый код на FASM и собрав его:

format PE GUI entry start include 'win32a.inc'

section '.text' code readable executable start: push 0 push 0 push 0 push 0 call dword[MessageBox]

push 0 call dword[ExitProcess]

section '.idata' import readable writeable library kernel, 'kernel32.dll',\ user, 'user32.dll'

import kernel,\ ExitProcess, 'ExitProcess'

import user,\ MessageBox, 'MessageBoxA'

section '.relocs' readable writeable fixups

... я сразу же столкнулся с проблемой. Alienyze не понимает программы, собранные на FASM, и просто ломается без каких-либо ошибок или сообщений, просто падает. Грустно. Видать, кривой PE-парсер.

Что-ж, пришлось взять для теста готовую программу, написанную на C/C++. С ней "пришелец" справился.

После запуска программы, появляется окно о том, что программа защищена демо-версией Alienyze, после чего успешно отрабатывает оригинальный код.

Техники защиты

Потыкав в отладчике сгенерированную программу, огорчило то, что в ней слишком мало кода... В том смысле, что Alienyze недостаточно хорошо морфит код. Конечно, странно ожидать от него какой-то мощной виртуальной машины, как у Themida или VMProtect, но всё же... Кода слишком мало, и он завязан на паре циклов, в которых идёт расшифровка кода, а затем задержки с постоянными проверками на наличие отладчика.

"Маловато, понимаешь... Маловато будет!"

Я не слишком силён в криптографии, поэтому даже не буду пытаться сказать, какое шифрование выбрано за основу, но вроде с этим там всё прилично.

А вот что снова расстроило - так это снова отсутствие каких-либо морферов на оригинальный код. Оригинальный код просто берёт, и расшифровывается прямо по адресу 0x401000, да-да! А после чего запускается в потоке. Причём увидеть и сдампить код очень просто, но об этом чуть позже...

Стоит сказать и немного хорошего про данный протектор.

Прежде всего, после первых попыток отладки я столкнулся с приятными трудностями - отладчик постоянно обнаруживался и программа закрывалась, когда я с этим справился - на голову свалилось то, что точки останова не работали, программа закрывалась при получении прерывания STATUS_BREAKPOINT.

Подключиться к программе тоже невозможно, все эти проверки работают в цикле, и при подключении отладчиком или CheatEngine - программа немедленно закрывалась.

Проверки хеш-суммы и на всякие патчи также присутсвуют. При попытке изменить имя секции - программа выдавала сообщение "This application is corrupted and cannot be run".

Также протектор скрывает импорт-таблицу. Все импорты подгружаются динамически с помощью функций LoadLibrary+GetProcAddress, и адресуются функции через EBP, почти как у меня в шеллкодах.

Без импортов, добавлена секция ".alien".

Также данного протектора нет в сигнатурах анализаторов файлов. Например, DetectItEasy не смог определить протектор, и выдал лишь информацию о линковщике:

Протектор не определён с помощью DetectItEasy

По поводу веса также положительно - вес с 9 килобайт увеличивается всего на 12.44 килобайт с учётом включённой функции сжатия внутри протектора на установке "Medium". Возможно, в платной версии можно сжимать ещё больше.

Присутствует в протекторе и защита на запуск внутри виртуальной среды. Она реализована с помощью cpuid:

При обнаружении виртуальной среды выдаёт сообщение - "Sorry, this application cannot run under this environment".

Обнаружение отладчика реализовано как в памяти, так и при подключении к процессу, один из методов - с помощью NtQueryObject, но до конца я это не разбирал.

Инструкция по обходу

А теперь то, с чего я и затеял эту статью - написать инструкцию по отладке программ, защищённых Alienyze Protector.

Дело в том, что в интернете нет вообще статей на подобную тему, протектор, возможно, в глаза никто не видел, а поэтому я буду тут первооткрывателем. Несмотря на свою простоту, он может всё же может быть где-то использован, а поэтому обязательно кто-то должен написать инструкцию по его отладке.

Итак, нам понадобится:

  1. x64dbg
  2. ScyllaHide

Закидываем программу в отладчик, и активируем ScyllaHide на профиле "VMProtect x86/x64".

Нажимаем CTRL+G, и пишем NtCreateThreadEx - с помощью данной функции протектор запускает поток на оригинальный расшифрованный код. Ставим точку останова на данной функции.

Готово. Запускаем исполнение, и ловим программу на исполнении функции NtCreateThreadEx, вот и финиш - оригинальный код находится в регистре ECX. Нажимаем CTRL+G, пишем ecx, и оригинальный код прямо перед Вами.

Вот такой вот интересный протектор.