Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Как пользоваться VMProtect?

  • Автор темы Автор темы XenoFob
  • Дата начала Дата начала
Лама - бох, ты - лох
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
14 Янв 2019
Сообщения
405
Реакции
59
Парни, приспичило освоить протект с помощью VMProtect. Создал простейшую dll (почти дефол от VS19), где есть 2 функции:
1) Экспортируемая int fnProject2()
2) Не экспортируемая int someFunc()
Я хочу запротектить обе функции. Я захожу в VMProtect, тыкаю "добавить функцию" там через поиск легко нахожу fnProject2, но someFunc нету. Почему так? Как запротектить someFunc? И можно ли как то повесить протект на весю dll целиком? И вообще есть какие нибудь гайды описывающие как правильно протектить?
 

Вложения

Как запротектить someFunc?
Ты можешь расставить метки с помощью SDK VMProtect'a, SDK должен быть в папке с самим протектором.
Как я помню что-то на подобии
Код:
Expand Collapse Copy
int example()
{
VMProtectBeginUltra("ProtectedFunctionName"); //Есть ещё маркеры, смотрим SDK

//code

VMProtectEnd();
}
 
Ты можешь расставить метки с помощью SDK VMProtect'a, SDK должен быть в папке с самим протектором.
Как я помню что-то на подобии
Код:
Expand Collapse Copy
int example()
{
VMProtectBeginUltra("ProtectedFunctionName"); //Есть ещё маркеры, смотрим SDK

//code

VMProtectEnd();
}
Спасибо! Помогло. Но все оказалось не так просто. Даже если ставишь метки в не экспортируемой функции, то он все равно не видит ее. Увидел он ее только после того, как я добавил вызов someFunc в fnProject2.
Можешь подсказать еще по паре вопросов?
1) Если я протекчу функцию, то все функции, которые вызываются внутри нее тоже протектятся?
2) Зачем нужен VMProtectSDK32(64).dll, если и без них все работает?
 
Нет, все функции протектиться не будут. Кстати, маркеры не захватывают прологи и эпилоги, даже если весь код функции будет заключен в маркеры. Это очень важно и является особенностью работы современных компиляторов.

Код:
Expand Collapse Copy
push ebp       |
mov ebp, esp   | Пролог
push 00        |
push ebx       |

... {Виртуализированный код}

pop ebx       |
pop ecx       | Эпилог
pop ebp       |
ret           |

Если же для выбора фрагментов кода для виртуализации использовать сгенерированный MAP-файл, то пролог и эпилог также виртуализируются, что значительно повышает защищенность защищаемой программы от взлома. Более того, одна виртуализированная функция вызывается из другой виртуализированной функции, управление передается между ними без фактического перехода на адрес вызываемой функции (вызов в данном случае является простым переходом на другой адрес в пределах байт-кода интерпретатора виртуальной машины).

Сама же реализация call после этого начинает интерпретироваться как push any, jmp addr, и, кстати, не возвращает управление отладчику, если перешагнуть.

Все модификации точки входа, которые делает крэкер, оказываются бесполезными. При работе с виртуализированными функциями передача управления в точку входа виртуализированной функции происходит только при вызове защищенной функции из незащищенного или мутированного фрагмента кода.

Делаем выводы:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Руководство по VMP:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Старенькая статья с форума VMP (как не стоит организовывать защиту программы):
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Нет, все функции протектиться не будут. Кстати, маркеры не захватывают прологи и эпилоги, даже если весь код функции будет заключен в маркеры. Это очень важно и является особенностью работы современных компиляторов.

Код:
Expand Collapse Copy
push ebp       |
mov ebp, esp   | Пролог
push 00        |
push ebx       |

... {Виртуализированный код}

pop ebx       |
pop ecx       | Эпилог
pop ebp       |
ret           |

Если же для выбора фрагментов кода для виртуализации использовать сгенерированный MAP-файл, то пролог и эпилог также виртуализируются, что значительно повышает защищенность защищаемой программы от взлома. Более того, одна виртуализированная функция вызывается из другой виртуализированной функции, управление передается между ними без фактического перехода на адрес вызываемой функции (вызов в данном случае является простым переходом на другой адрес в пределах байт-кода интерпретатора виртуальной машины).

Сама же реализация call после этого начинает интерпретироваться как push any, jmp addr, и, кстати, не возвращает управление отладчику, если перешагнуть.

Все модификации точки входа, которые делает крэкер, оказываются бесполезными. При работе с виртуализированными функциями передача управления в точку входа виртуализированной функции происходит только при вызове защищенной функции из незащищенного или мутированного фрагмента кода.

Делаем выводы:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Руководство по VMP:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Старенькая статья с форума VMP (как не стоит организовывать защиту программы):
Пожалуйста, авторизуйтесь для просмотра ссылки.
Спасибо за инфу! Я читал про MAP файлы, генерировал их, но как их добавить в VMP? Они сами подтягиваются?

Нет, все функции протектиться не будут.
Я попробовал маркерами протектить функцию fnProject2 (напомню, из этой функции вызывается someFunc), а потом еще протектить внутри someFunc, но тогда vmp мне пишет "VMProtectMarker "ggvp2".10001030: Адрес уже используется функцией "VMProtectMarker "ggvp1"" это нормально? Или я что то делаю не так?
Код:
C++:
Expand Collapse Copy
PROJECT1_API int fnProject1(void)
{
    VMProtectBeginUltra("ggvp1");
    int i = someFunc();
    return i;
    VMProtectEnd();
}


int someFunc() {
    VMProtectBeginUltra("ggvp2");
    return 256;
    VMProtectEnd();
}
 
Спасибо за инфу! Я читал про MAP файлы, генерировал их, но как их добавить в VMP? Они сами подтягиваются?


Я попробовал маркерами протектить функцию fnProject2 (напомню, из этой функции вызывается someFunc), а потом еще протектить внутри someFunc, но тогда vmp мне пишет "VMProtectMarker "ggvp2".10001030: Адрес уже используется функцией "VMProtectMarker "ggvp1"" это нормально? Или я что то делаю не так?
Код:
C++:
Expand Collapse Copy
PROJECT1_API int fnProject1(void)
{
    VMProtectBeginUltra("ggvp1");
    int i = someFunc();
    return i;
    VMProtectEnd();
}


int someFunc() {
    VMProtectBeginUltra("ggvp2");
    return 256;
    VMProtectEnd();
}
Если заключать всю процедуру в маркеры и внутри этой процедуры включаете еще маркер, то у вас как раз возникнет вот такая ошибка. Кстати, с вложенными маркерами внутри одной функции такой ошибки нет. Может быть, что VMP реально протектит всю функцию по адресу ее вызова... Но как он конец этой функции определяет - не известно.

Кстати, в примере с int someFunc() ультра протекция не имеет смысла все из-за тех же эпилогов маркеров.

Генерацию MAP-файла можно определить в настройках компилятора.
1558071609235.png

Сгенерированный MAP-файл будет и должен лежать рядом с защищаемым приложением, тогда он будет подгружаться вместе с файлом.
1558071770902.png
 
Если заключать всю процедуру в маркеры и внутри этой процедуры включаете еще маркер, то у вас как раз возникнет вот такая ошибка. Кстати, с вложенными маркерами внутри одной функции такой ошибки нет. Может быть, что VMP реально протектит всю функцию по адресу ее вызова... Но как он конец этой функции определяет - не известно.

Кстати, в примере с int someFunc() ультра протекция не имеет смысла все из-за тех же эпилогов маркеров.

Генерацию MAP-файла можно определить в настройках компилятора. Посмотреть вложение 23670
Сгенерированный MAP-файл будет и должен лежать рядом с защищаемым приложением, тогда он будет подгружаться вместе с файлом.
Посмотреть вложение 23671
Спасибо, понял. Кстати пробовал протектить .exe с мап файлом, но вмп видел только энтри поинт. Это нормально?
 
Спасибо, понял. Кстати пробовал протектить .exe с мап файлом, но вмп видел только энтри поинт. Это нормально?
Ну, точка входа определяется автоматически, а остальные функции нужно добавлять. Кстати, вам нужно будет добавить в проект две функции: _main (так Visual Studio переименовала нашу функцию main()) и foo(). Обе функции видны в списке функций в VMProtect в разделе "Функции" - описано в справке по VMP.
 
Ну, точка входа определяется автоматически, а остальные функции нужно добавлять.
Через маркеры или по адресам? Потому вмп вообще ничего не видит кроме энтри поинта, ни в разделе "функции" ни в форме "добавить функцию".
 
Через маркеры или по адресам? Потому вмп вообще ничего не видит кроме энтри поинта, ни в разделе "функции" ни в форме "добавить функцию".
По адресам, ну или по названию функции. Делать это в самом VMP -> 'Добавить функцию'.
 
Назад
Сверху Снизу