VMProtect 3.0

Issues related to VMProtect
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: VMProtect 3.0

Post by Admin »

Разработка SE временно прекращена.
RomanRom2
Posts: 2
Joined: Sun Oct 11, 2015 11:59 pm

Re: VMProtect 3.0

Post by RomanRom2 »

Admin wrote:1. Ядро полностью переписано на C++ (больше никакого паскаля и ассемблера)
а что было на паскале (дельфи?) и что не устроило в нем? если не секрет.
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: VMProtect 3.0

Post by Admin »

Версия 2.X полностью написано на Delphi. Не устроило в первую очередь отсутствие возможности компиляции проекта под другие операционные системы (OSX, Linux, etc.). У С++ + Qt таких проблем нет.
RomanRom2
Posts: 2
Joined: Sun Oct 11, 2015 11:59 pm

Re: VMProtect 3.0

Post by RomanRom2 »

что сделано то сделано, конечно.
но у дельфи сейчас с этим тоже проблем нет.
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: VMProtect 3.0

Post by Admin »

Не знаю как дела обстоят сейчас, но 3 года назад к примеру еще не было компилятора под х64 + компиляция под OSX была возможно только с использованием FireMonkey, который был еще жуткой сырой. Да и в целом кодогенерация под OSX ужасна до сих пор (про оптимизацию там походу ниразу не слышали).
RASTAMAN
Posts: 2
Joined: Fri Oct 23, 2015 4:11 pm

Re: VMProtect 3.0

Post by RASTAMAN »

Image
по вашему все в порядке ?
и с VMProtectDecryptStringA всегда креш ...
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: VMProtect 3.0

Post by Admin »

VMProtectSDK, которую вы используете в проекте, на самом деле представляет из себя "пустышку":

Code: Select all

const char * VMP_API VMProtectDecryptStringA(const char *value) 
{ 
	return value; 
}

const VMP_WCHAR * VMP_API VMProtectDecryptStringW(const VMP_WCHAR *value) 
{ 
	return value; 
}

bool VMP_API VMProtectFreeString(void *) 
{ 
	return true; 
}

int VMP_API VMProtectGetOfflineActivationString(const char *, char *, int) 
{
	return ACTIVATION_OK;
}

int VMP_API VMProtectGetOfflineDeactivationString(const char *, char *, int) 
{
	return ACTIVATION_OK;
}
В процессе обработки программы VMProtect добавляет в приложение уже реальный код, который тоже защищается виртуализацией (при этом удаляется зависимость от VMProtectSDKXX.dll). В результате итоговый размер программы может быть гораздо больше оригинала даже при включении упаковки. Добавление к размеру файлу + 1Мб - это в данном случае вполне нормально.

По поводу VMProtectDecryptStringA - присылайте тестовый пример (оригинальный EXE+MAP+VMP файлы).
RASTAMAN
Posts: 2
Joined: Fri Oct 23, 2015 4:11 pm

Re: VMProtect 3.0

Post by RASTAMAN »

Спасибо за ответ . Сегодня проверил защищенный текст и оказалось не смотря на то, что в моей функции его нет, он остался в памяти приложения в открытом виде ... Даже после freestring . Проблема только у длл файлов . Есть способ скрыть его или зашифровать ?

в второй версии очистка стринга работает не как следует
но даже она лучше чем в третей версии !

исход

void update()
{
VMProtectBegin("Test 1");

char * param = VMProtectDecryptStringA("TEST PROTECTED STRING");
MessageBoxA(0,"TEST_1",0,0);
VMProtectFreeString(param);
MessageBoxA(0,"TEST_2",0,0);

VMProtectEnd();
return;
}

vmp 2.12.3

Image

- после очистки осталось половина текста.

vmp 3.0.5

Image

-стринг остался без изменений + размер в 2 раза больше чем на vmp 2

вынужден использовать старую версию =(
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: VMProtect 3.0

Post by Admin »

Вы точно уверены, что в процессе работы MessageBoxA в системе не были созданы темповые строки, которые просто не успели "затереться" из-за недостаточной работой с кучей? У меня вот например нет такой уверенности. Для чистоты эксперимента я бы полностью исключил все промежуточные API:

Code: Select all

char * param = VMProtectDecryptStringA("TEST PROTECTED STRING");
VMProtectFreeString(param);
И еще один момент. При нескольких вызовах VMProtectDecryptStringA с одной и тойже строкой VMProtect накручивает счетчик ссылок для результата и VMProtectFreeString полностью освободит строку только при условии, что счетчик ссылок будет равен 0:

В этом случае строка останется в памяти хотя результат от обоих VMProtectDecryptStringA будет одинаковым:

Code: Select all

char * param = VMProtectDecryptStringA("TEST PROTECTED STRING");
param = VMProtectDecryptStringA("TEST PROTECTED STRING");
VMProtectFreeString(param);
Post Reply