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

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

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

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

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

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

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

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

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




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



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



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

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



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



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

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



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

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

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



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

Принимаю любые предложения, баг-репорты, аргументированную критику, всех благ, всем спасибо!
 
Последнее редактирование:
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
Стоять нужно на EP, чтобы скрипт сработал. Если вдруг у вас отладчик неправильно выбирает точку входа, а это можно понять, что если у вас стоит авто-бряк на точку входа, но не останавливается на ней, а выскакивает CRC-ошибка, то значит нужно найти ее самим. Ставите системный бряк в настройках, и проходите несколько функций (10-20), далее выходите на EP, ставите бряк и ставите метку.
 
freeze me.
Забаненный
Статус
Оффлайн
Регистрация
23 Июл 2019
Сообщения
152
Реакции[?]
37
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Разработчик
Статус
Оффлайн
Регистрация
31 Мар 2017
Сообщения
79
Реакции[?]
84
Поинты[?]
0
Уже не валид. При попытке бряка просто дропает с отладчика.
Хотя странно, ибо я тестил на 3.5

1608234449478.png
 
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
Уже не валид. При попытке бряка просто дропает с отладчика.
Хотя странно, ибо я тестил на 3.5

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

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


Либо я тупой, либо я тупой.
p.s.
Scylla также по идее должна BuildNumber менять.
1608280540036.png
p.p.s.
У меня Win10H2 если что
p.p.p.s.
А стой, кажется я не ту галку поставил xD
p.*4s.
Нет, даже с этими галками меня дропает
 
Последнее редактирование:
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
Похоже работает только когда установлен максимальный пресет защиты.(c анти-отладкой) Попробуй на файле, который ты скидывал мне последним
 
Последнее редактирование:
Разработчик
Статус
Оффлайн
Регистрация
31 Мар 2017
Сообщения
79
Реакции[?]
84
Поинты[?]
0
Похоже работает только когда установлен максимальный пресет защиты.(c анти-отладкой) Попробуй на файле, который ты скидывал мне последним
Да, на максимальном сиськолы дергаются. Ну, думаю это из-за того, что это чисто антиотладочный модуль был)
 
Начинающий
Статус
Оффлайн
Регистрация
31 Янв 2022
Сообщения
2
Реакции[?]
0
Поинты[?]
0
Пытаюсь повторить изложенную методику 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'ов...
 
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
Пытаюсь повторить изложенную методику 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
 
Начинающий
Статус
Оффлайн
Регистрация
31 Янв 2022
Сообщения
2
Реакции[?]
0
Поинты[?]
0
Ответ довольно прост, на приложении используется более новая версия VMProtect
Спасибо за ответ. Да, это возможно более новая версия (но не факт), ибо данная причина не является определяющей в части "File corrupted!.."
Поясняю. У меня давняя и длительная история взаимной любви с Target, так вот предыдущие версии были накрыты более ранним VMProtect'ом v.3.x, и у него точно та же история с "File corrupted!.." Однако там NAG не мешал, т.к. для bypass VM можно было установить bp в коде между ЕР и ОЕР, где нет проверки CRC, и при срабатывании bp снять нужную информацию регистров для патча. Теперь же в последних версиях по старой методике место для bp также можно найти, однако в регистрах ожидаемой информации просто нет...
Ваша методика, похоже, спасла бы ситуацию, если б только не "File corrupted!.."

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