Использование маркеров в Visual C

Как в Visual C использовать маркеры начала/конца защищаемого блока ?
(db $EB,$10,‘VMProtect begin’,0)

В [u]дистрибутиве[/u] есть также примеры использования маркеров для различных компиляторов (в том числе и для Visual C).

...
#include "VMProtectSDK.h"
...
	VMProtectBegin
	char buf[100]; 
	GetDlgItemText(hDlg, IDC_EDIT, buf, 100);
	if (atoi (buf) >> 1 == 1) 
		MessageBox(hDlg, "Correct password", "Information", MB_ICONINFORMATION + MB_OK);
	else
	{    
		MessageBox(hDlg, "Incorrect password", "Error", MB_ICONERROR + MB_OK);
		SetFocus(GetDlgItem(hDlg, IDC_EDIT));
	}
	VMProtectEnd
...

VMProtectSDK.h лежит в папке с примерами.

Спасибо.
Еще вопрос - в демо-версии каковы ограничение на блок, защищаемый маркерами (размер, …) ?

В демо версии существуют следующие ограничения:

    • Недоступны опции защиты
  • Нет шифрации байткода
  • Нет обфускации байткода
  • Защитить можно всего одну процедуру
  • Исполнитель ВМ не видоизменяется

Под процедурой также понимается маркер или строковая константа (т.е. защищаемый объект).

Как использовать vmprotect_con (в режиме командной строки) ?
Делаю так:
VMProtect_Con.exe Программа.exe Программа1.exe
Результат - [Ошибка] Нет данных для компиляции

“Программа.exe” указывается без полного пути до файла?

И с локальным именем, и с полным результат одинаковый:
VMProtect_Con.exe E:\Программа.exe E:\Программа1.exe

Рядом с “Программа.exe” должен находиться “Программа.vmp” (файл проекта, предварительно подготовленный в GUI версии) и “Программа.map” (если вы используете в проекте имена процедур из MAP файла).

Благодарю, разобрался !

Добрый день.
Хочу задать еще один вопрос по маркерам.
Какие условия должны быть соблюдены при размещении маркеров в тексте программы?
В частности интересует:

  • допустима ли вложенность маркеров. Если да, то как обрабатываются вложенные маркеры;
  • возможен ли переход из участка кода, обрамленного маркерами за внешние границы участка?
  • возможен ли переход из внешнего (незащищенного) участка кода программы внутрь кода, обрамленного маркерами?

Спасибо.

Вложенность маркеров в принципе допустима (т.е. не будет влиять на работоспособность кода). Приведу пример:

VMProtectBegin2
...
VMProtectBegin1
...
VMProtectEnd1
...
VMProtectEnd2

В этом случае границами маркера будут являться только VMProtectBegin1 и VMProtectEnd1.

возможен ли переход из участка кода, обрамленного маркерами за внешние границы участка?

Возможен.

  • возможен ли переход из внешнего (незащищенного) участка кода программы внутрь кода, обрамленного маркерами?

Рассмотрим пример:

jmp @1
...
VMProtectBegin
...
@1:
...
VMProtectEnd

В данном случае адрес метки “@1” нужно помечать как “внешний” с помощью GUI версии (в результате по этому адресу будет создан так называемый переходник, который будет передавать управление исполнителю ВМ), иначе по этому адресу скорее всего будет мусор (либо совершенно постороний код) и передача управления на этот адрес может привести к непредсказуемым последствиям.

Спасибо

Я закрыл участки кода у многих инлайн-функций. В итоге получилось совсем не то что я ожидал - вложенные маркеры и т.д.
Поэтому просто убрал маркеры из тела инлайн-функций и разместил их вокруг вызовов этих функций. В итоге получил отлично компилируемый VMProtect-ором проект (т.е. так как я хотел) .

Кстати, попутно решил проблему нестабильности еще одной моей программы. Оказалось, что прямо из незещищенного участка кода был джамп внутрь защищенного участка кода…
Работа с маркерами требует большой внимательности, но и результат соответствует. Все таки критичные ко времени исполнения и достаточно уязвимые участки кода удобнее обрамлять маркерами, нежели виртуализировать всю функцю посредством map-файла.

Для определения ситуаций перехода из незащищенного кода в защищенный предназначен “Режим отладки” (расположен на закладке “Опции”). В режиме отладки вся область защищаемого кода после обработки заполняется командой INT 03, т.е. при запуске приложения в отладчике отладчик остановится на адресе перехода из незащищенного кода в защищенный (тем самым показывая вам такой переход) и можно будет принять соотвествующие меры - либо пометить этот адрес как внешний, либо переписать часть кода для избежания данной ситуации.

Ух ты!
К сожалению такую подробную информацию о “режиме отладки” не увидел в хелпе. Иначе разобрался бы намного раньше.

Как оказалось, форум все-таки нужен :slight_smile:. Много интересного уже узнал, а не прошло и пары суток.

Но, все таки думаю, что описание таких важных вопросов должно располагаться в документации на продукт.