Защита программы протектором VMProtect

Добрый день.

Я разработал серьезный продукт и хочу его защитить VMProtect(ом).
Меня интересуют следующие вопросы:

  1. Ведете ли Вы какую-нибудь статистику по взломам программ, использующих VMProtect?
  2. Чем защищен сам протектор?
  3. В интернете неоднократно встречал ссылки на ломанный протектор, значит ли это,
    что и защищенную программу будет легко взломать?

С уважением.

  1. Да, мы отслеживаем попытки взлома программ наших клиентов. В некоторых случаях действительно защищенные программы ломают, но при более детальном изучении оказывается, что из всех возможностей VMProtect-а используется только упаковка или разработчик забыл включить в защиту критичный код.
  2. VMProtect защищен собой.
  3. Все что вы встречаете в инете - это лицензионные версии, купленные “добрыми” кардерами и выложенные в общий доступ. Это значит, что если программу трудно взломать, то её проще купить по ворованной кредитке :slight_smile:)

Спасибо за оперативный ответ.

Еще вопрос:

Все тонкости протектора и его использования знает только разработчик, т.е. - Вы.
Существует ли у Вас услуга “защита под ключ”, т.е. я передаю Вам программу, а Вы делаете ей максимальную защиту, но при этом я плачу только за услугу, а не за лицензию на протектор?

С уважением.

Да, мы можем предложить вам такую услугу, но стоимость её будет в разы больше стоимости лицензии VMProtect.

А какие будут условия?
Что необходимо от меня кроме оплаты?
Должен ли я буду предоставить исходники программы?

С уважением.

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

Совсем недавно один из членов команды RED CREW выложил в своём блоге исходники загрузчика для обхода защиты VMProtect. Подробно об этом можно почитать [u]здесь[/u] и [u]здесь[/u].

Вопрос к разработчикам: Что это значит для пользователей Вашего продукта и какие потенциальные угрозы это несет?

Да там особо и разбирать то нечего.
“And if you scroll down, you will see the typical VMP errors checks:” - крякер ошибочно думает, что сообщения типа “Can not find file…”, “Can not read…” это сообщения защиты. На самом деле это код программы, который просто ничем не защищен. В результате имеем классический патч в виде безусловного перехода, который перепрыгивает все вызовы VMPrortectGetCurrentHWID и VMPrortectSetSerialNumber. Есть подозрение, что разработчик использовал в качестве защиты только одну упаковку и совершенно не позаботился о защите критичных участков своей программы (я даже не говорю про привязку кода к серийнику или хотябы минимальные проверки в виде VMProtectGetSerialNumberState) - поэтому имеем вот такой вот результат.

Хотелось бы на этом примере показать еще раз как не стоит организовывать защиту программы:

  1. Нельзя использовать упаковку как единственный метод защиты. Основная фишка VMProtect - это все-таки виртуализация критичного кода программы и если из всего функционала использовать лишь упаковку, то снятие защиты будет не труднее чем снятие UPX.
  2. Разработчики допускают классические ошибки вида:
(some code)
...
VMProtectBegin('My marker');
int res = VMProtectSetSerialNumber(...);
VMProtectEnd();
if (res) {
 MessageBox(...,'Invalid serial number');
}
...
(some code)

Что мы здесь видим? Здесь мы видим, что результат работы защищенной функции (в нашем случае это VMProtectSetSerialNumber, но там может быть любая другая пользовательская функция) анализируется уже в незащищенном коде. Т..е. опять имеет классически патч в виде обхода маркера и самой проверки:

(some code)
...
JMP @1 <- patch here
VMProtectBegin('My marker');
int res = VMProtectSetSerialNumber(...);
VMProtectEnd();
if (res) {
 MessageBox(...,'Invalid serial number');
}
@1:
...
(some code)

В данном примере в маркер должна попадать как минимум сама проверка “if (res)”, а как максимум я бы порекомендовал засунуть в маркер еще и код, который инициализирует какие-либо объекты, без которых программа просто не сможет работать:

VMProtectBegin('My marker');
(important code)
...
int res = VMProtectSetSerialNumber(...);
if (res) {
 MessageBox(...,'Invalid serial number');
}
...
(important code)
VMProtectEnd();
  1. Рассмотрим еще один пример:
int foo()
{
VMProtectBegin('foo');
return VMProtectGetSerialNumber(...);
VMProtectEnd();
}

void main()
{
VMProtectBegin('My marker');
(some code)
...
int res = foo();
if (res) {
 MessageBox(...,'Invalid serial number');
}
...
(some code)
VMProtectEnd();
}

Что мы здесь видим? Видим, что foo, результат которой нам очень важен, на самом деле оказывается не защищен из-за особенностей маркеров на захватывать прологи и эпилоги. Т.е. после виртуализации foo мы получим нечто подобное:

push ebp
mov ebp, esp
sub ebp, XXXX
...
(virtualized code)
...
pop ebp
ret

Теперь крякеру не составит труда подкорретировать результат функции:

...
pop ebp
xor eax, eax <- patch here
ret

Подобные посты - "как не надо организовывать защиту" и топики - "общие рекомендации по организации защиты", надо подавать под грифом - крайне рекомендовано для прочтения, как отче наш :slight_smile: Это я не сарказма ради, а вполне серьезно. Мне как начинающему пользователю VMProtect Ultimate например это очень пригодилось, хотя обратил внимание не сразу…

Прочитал всю справку, но так и не понял как добавить маркер в списках процедур в проекте накрытия протектором?

Нахожу только VMProtectEnd().

#include "VMProtectSDK.h"
...
VMProtectBegin(NULL);
// your code here
VMProtectEnd();

Еще рекомендую посмотреть примеры из папки Examples

Все нашлось. спасибо!

Скажите, почему я не должен ВСЕ процедуры заворачивать в VMProtectBegin - VMProtectEnd ?

Скажите, почему я не должен ВСЕ процедуры заворачивать в VMProtectBegin - VMProtectEnd ?

Вы защищаете только те функции, которые критичны для анализа и взлома (например проверка регистрации или каких-то ограничений в триальной версии вашей программы). Какой смысл например виртуализировать стандартный рантайм компилятора, если его никто изучать или ломать не будет?

Это чисто теоритический вопрос.

Нужно защитить программу, которая должна работать на Windows 2000. Реально ли это, или у VMProtect есть свои ограничения, не позволяющие запускать защищённый файл на определённых о/с? На самом сайте не нашёл никакой информации по этому вопросу :frowning:

VMProtect поддерживает программы, работающие в Windows 2000.

Т.е. у программ, которые защищены с помощью VMProtect, никаких проблем с запуском/работой на Windows 2000 нет - всё верно?

Да, все верно. Вы можете это проверить с помощью демо версии.