Page 1 of 1

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

Posted: Fri Apr 06, 2007 11:53 am
by Impulse
Как в Visual C использовать маркеры начала/конца защищаемого блока ?
(db $EB,$10,'VMProtect begin',0)

Posted: Fri Apr 06, 2007 11:59 am
by Admin
В дистрибутиве есть также примеры использования маркеров для различных компиляторов (в том числе и для Visual C).

Code: Select all

...
#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 лежит в папке с примерами.

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

Posted: Fri Apr 06, 2007 12:05 pm
by Impulse
Спасибо.
Еще вопрос - в демо-версии каковы ограничение на блок, защищаемый маркерами (размер, ...) ?

Posted: Fri Apr 06, 2007 12:11 pm
by Admin
В демо версии существуют следующие ограничения:
  • * Недоступны опции защиты
    * Нет шифрации байткода
    * Нет обфускации байткода
    * Защитить можно всего одну процедуру
    * Исполнитель ВМ не видоизменяется
Под процедурой также понимается маркер или строковая константа (т.е. защищаемый объект).

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

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

Posted: Fri Apr 06, 2007 12:33 pm
by Admin
"Программа.exe" указывается без полного пути до файла?

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

Posted: Fri Apr 06, 2007 12:42 pm
by Impulse
И с локальным именем, и с полным результат одинаковый:
VMProtect_Con.exe E:\Программа.exe E:\Программа1.exe

Posted: Fri Apr 06, 2007 12:45 pm
by Admin
Рядом с "Программа.exe" должен находиться "Программа.vmp" (файл проекта, предварительно подготовленный в GUI версии) и "Программа.map" (если вы используете в проекте имена процедур из MAP файла).

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

Posted: Fri Apr 06, 2007 12:48 pm
by Impulse
Благодарю, разобрался !

Posted: Fri Apr 20, 2007 10:16 am
by GMC
Добрый день.
Хочу задать еще один вопрос по маркерам.
Какие условия должны быть соблюдены при размещении маркеров в тексте программы?
В частности интересует:
- допустима ли вложенность маркеров. Если да, то как обрабатываются вложенные маркеры;
- возможен ли переход из участка кода, обрамленного маркерами за внешние границы участка?
- возможен ли переход из внешнего (незащищенного) участка кода программы внутрь кода, обрамленного маркерами?

Спасибо.

Posted: Fri Apr 20, 2007 10:37 am
by Admin
GMC wrote:- допустима ли вложенность маркеров. Если да, то как обрабатываются вложенные маркеры;
Вложенность маркеров в принципе допустима (т.е. не будет влиять на работоспособность кода). Приведу пример:

Code: Select all

VMProtectBegin2
...
VMProtectBegin1
...
VMProtectEnd1
...
VMProtectEnd2
В этом случае границами маркера будут являться только VMProtectBegin1 и VMProtectEnd1.
возможен ли переход из участка кода, обрамленного маркерами за внешние границы участка?
Возможен.
- возможен ли переход из внешнего (незащищенного) участка кода программы внутрь кода, обрамленного маркерами?
Рассмотрим пример:

Code: Select all

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

Posted: Fri Apr 20, 2007 3:13 pm
by GMC
Спасибо

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

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

Posted: Fri Apr 20, 2007 4:54 pm
by Admin
Для определения ситуаций перехода из незащищенного кода в защищенный предназначен "Режим отладки" (расположен на закладке "Опции"). В режиме отладки вся область защищаемого кода после обработки заполняется командой INT 03, т.е. при запуске приложения в отладчике отладчик остановится на адресе перехода из незащищенного кода в защищенный (тем самым показывая вам такой переход) и можно будет принять соотвествующие меры - либо пометить этот адрес как внешний, либо переписать часть кода для избежания данной ситуации.

Posted: Fri Apr 20, 2007 5:13 pm
by GMC
Ух ты!
К сожалению такую подробную информацию о "режиме отладки" не увидел в хелпе. Иначе разобрался бы намного раньше.

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

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