• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

Гайд Bypass VMProtect 3.5 x64 (C++)

ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
219
Реакции
338
Всем привет. На связи я, Dark_Bull! Сегодня я с вами не надолго, но буду делиться с вами новым способом обхода(нашел сам) VMProtect 3.5.0 x64 build 1213;

=========================================================

Все опыты проводились на Windows 10 x64 1909 (Сборка ОС 18363.1016) – процессор Intel

Подопытный: C++ x64 PE-файл, максимальный пресет защиты от протектора

TitanHide – не использовался

=========================================================

Давайте разбираться, что же такого завезли нам в новой версии.

Для начала подготовим ScyllaHide:

scyllahide.png



Далее, в настройках ядра самого отладчика(x64dbg) нужно установить “Тип точек останова по умолчанию” на “UD2”:

settingx64dbg.png


Всё дело в том, что UD2 меньше обнаруживается самим VMProtect, пользуйтесь) Наверняка, если хотите, подгрузите TitanHide, но мне не пригодился.



Дело в том, что как вы могли заметить, при отладке какого-либо приложения, защищенного новой версией протектора, вы, как в старых версиях, не получаете 3-nop-исключения. Всё это происходит из-за одного трюка вмпшки, который мы с вами сейчас будем обходить. Плагины тоже не могут это обойти, т.к. вызов происходит непосредственно через SYSCALL.

Ищем все SYSCALL’s путем поиска паттерна “0F0568”, где “0F05” – сама инструкция SYSCALL, а “68” – нужен для отсеивания лишних SYSCALL’s.

bpsyscalls.png


Далее, устанавливаем на все наши найденные инструкции брейкпоинты.

bpsetsyscalls.png


И нажимаем “Выполнить” до тех пор, пока в регистре RAX не будет значение 0xD.

Почему 0xD? Потому что это и есть новый трюк протектора. Дело в том, что SYSCALL 0xD, это вызов WinAPI-функции “NtSetInformationThread” с константой, которая думаю вам всё скажет своим названием - “ThreadHideFromDebugger”(или же 0x11, значение лежит в регистре RDX):

Thread-Hide-From-Debugger.png


Далее меняем 0x11, в регистре RDX на любое другое, но только не 0x11, будете получать результат выполнения функции в регистре RAX с ошибкой – не обращайте внимание на нее, всё хорошо ?

УДАЛЯЕМ ВСЕ ТОЧКИ ОСТАНОВА, и только после этого нажимаем “Выполнить”

Вуаля, что мы видим? Наши заветные NOP-исключения:

result-NOPs.png


Секция с кодом программы расшифрована. Далее просто ставим аппаратный бряк на ваше OEP, как его искать, думаю вы знаете) Ну или WinAPI-шные функции брякайте. GetCommandLineA - ваш друг

Принимаю любые предложения, баг-репорты, аргументированную критику, всех благ, всем спасибо!
 
Последнее редактирование:
:roflanEbalo: Теперь ждём, как сольют байпасс фейсита
 
Стоять нужно на EP, чтобы скрипт сработал. Если вдруг у вас отладчик неправильно выбирает точку входа, а это можно понять, что если у вас стоит авто-бряк на точку входа, но не останавливается на ней, а выскакивает CRC-ошибка, то значит нужно найти ее самим. Ставите системный бряк в настройках, и проходите несколько функций (10-20), далее выходите на EP, ставите бряк и ставите метку.
 
Хм не очень то
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Уже не валид. При попытке бряка просто дропает с отладчика.
Хотя странно, ибо я тестил на 3.5

1608234449478.png
 
Уже не валид. При попытке бряка просто дропает с отладчика.
Хотя странно, ибо я тестил на 3.5

Посмотреть вложение 119474
Я не просто так оставлял параметры винды, на которой был проведен обход.
Всё отлично работает. Дело в том, что ВМПрот применяет свои методы защиты в зависимости от билда windows.
Поэтому на некоторых версиях винды можно отключить половину его трюков) Ну и если, стоя на EP, ты перейдешь в дамп по адресу peb() + 0x120 и изменишь билд на "BB47", (если перевести в dec, то как раз 18363):
1608240972705.png

не забудь в сцилле поставить галочку на BeingDebugged(у меня почему-то перестал автоматически xdbg патчить peb() + 0x002, видимо где-то в настройках накосячил). Вуаля:
1608241109858.png
 
Последнее редактирование:
Я не просто так оставлял параметры винды, на которой был проведен обход.
Всё отлично работает. Дело в том, что ВМПрот применяет свои методы защиты в зависимости от билда windows.
Поэтому на некоторых версиях винды можно отключить половину его трюков) Ну и если, стоя на EP, ты перейдешь в дамп по адресу peb() + 0x120 и изменишь билд на "BB47", (если перевести в dec, то как раз 18363):
Посмотреть вложение 119493
не забудь в сцилле поставить галочку на BeingDebugged(у меня почему-то перестал автоматически xdbg патчить peb() + 0x002, видимо где-то в настройках накосячил). Вуаля:
Посмотреть вложение 119494
Благодарю. То, что VMP по-разному работает в зависимости от версии винды я знал, но прям, чтобы еще и от сборки что-то зависело, это, конечно, круто.
 

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.


Либо я тупой, либо я тупой.
p.s.
Scylla также по идее должна BuildNumber менять.
1608280540036.png

p.p.s.
У меня Win10H2 если что
p.p.p.s.
А стой, кажется я не ту галку поставил xD
p.*4s.
Нет, даже с этими галками меня дропает
 
Последнее редактирование:
Похоже работает только когда установлен максимальный пресет защиты.(c анти-отладкой) Попробуй на файле, который ты скидывал мне последним
 
Последнее редактирование:
Похоже работает только когда установлен максимальный пресет защиты.(c анти-отладкой) Попробуй на файле, который ты скидывал мне последним
Да, на максимальном сиськолы дергаются. Ну, думаю это из-за того, что это чисто антиотладочный модуль был)
 
Пытаюсь повторить изложенную методику bypass, используя реальную target под VMProtect'ом v.3.x. Для чистоты эксперимента установил Win 10 1909 (сборка ОС 19041.1). Процессор Intel.
Загружаю target в x64dbg, при попытке запуска первая (ожидаемая) козья морда: debugger палится. Подключаю ScyllaHide и проверяю всевозможные варианты установки опций - ни один, однако, не срабатывает. Тогда подключаю SharpOD x64, и он легко справляется при стандартном наборе: Hide PEB, VMP 3.1 (above) и Hook *ZwFunktions.
Теперь при запуске получаю следующий NAG: "File corrupted!.." Довольно странно, т.к. экзешник оригинальный без каких-либо изменений. К тому же в debugger'e нет никаких установленных bp. Первым делом замучал перебором опций ScyllaHide и SharpOD (в том числе при совместном использовании) - даже намёка нет на положительный результат. Перерыл весь inet, встретил несколько аналогичных вопросов, но они так и остались без ответа.
Где копать??

P.S. Разницы в использовании Win 7 x64 и Win 10 x64 для решения данной задачи не обнаружил.
По сигнатуре 0F0568 нашлось 10 совпадений, из них 7 реальных SYSCALL'ов...
 
Пытаюсь повторить изложенную методику bypass, используя реальную target под VMProtect'ом v.3.x. Для чистоты эксперимента установил Win 10 1909 (сборка ОС 19041.1). Процессор Intel.
Загружаю target в x64dbg, при попытке запуска первая (ожидаемая) козья морда: debugger палится. Подключаю ScyllaHide и проверяю всевозможные варианты установки опций - ни один, однако, не срабатывает. Тогда подключаю SharpOD x64, и он легко справляется при стандартном наборе: Hide PEB, VMP 3.1 (above) и Hook *ZwFunktions.
Теперь при запуске получаю следующий NAG: "File corrupted!.." Довольно странно, т.к. экзешник оригинальный без каких-либо изменений. К тому же в debugger'e нет никаких установленных bp. Первым делом замучал перебором опций ScyllaHide и SharpOD (в том числе при совместном использовании) - даже намёка нет на положительный результат. Перерыл весь inet, встретил несколько аналогичных вопросов, но они так и остались без ответа.
Где копать??

P.S. Разницы в использовании Win 7 x64 и Win 10 x64 для решения данной задачи не обнаружил.
По сигнатуре 0F0568 нашлось 10 совпадений, из них 7 реальных SYSCALL'ов...
Ответ довольно прост, на приложении используется более новая версия VMProtect
 
Ответ довольно прост, на приложении используется более новая версия VMProtect
Спасибо за ответ. Да, это возможно более новая версия (но не факт), ибо данная причина не является определяющей в части "File corrupted!.."
Поясняю. У меня давняя и длительная история взаимной любви с Target, так вот предыдущие версии были накрыты более ранним VMProtect'ом v.3.x, и у него точно та же история с "File corrupted!.." Однако там NAG не мешал, т.к. для bypass VM можно было установить bp в коде между ЕР и ОЕР, где нет проверки CRC, и при срабатывании bp снять нужную информацию регистров для патча. Теперь же в последних версиях по старой методике место для bp также можно найти, однако в регистрах ожидаемой информации просто нет...
Ваша методика, похоже, спасла бы ситуацию, если б только не "File corrupted!.."

Может гуру подскажет, в какую сторону грести?..
 
Назад
Сверху Снизу