VMProtect 3.0
Re: VMProtect 3.0
Разработка SE временно прекращена.
Re: VMProtect 3.0
а что было на паскале (дельфи?) и что не устроило в нем? если не секрет.Admin wrote:1. Ядро полностью переписано на C++ (больше никакого паскаля и ассемблера)
Re: VMProtect 3.0
Версия 2.X полностью написано на Delphi. Не устроило в первую очередь отсутствие возможности компиляции проекта под другие операционные системы (OSX, Linux, etc.). У С++ + Qt таких проблем нет.
Re: VMProtect 3.0
что сделано то сделано, конечно.
но у дельфи сейчас с этим тоже проблем нет.
но у дельфи сейчас с этим тоже проблем нет.
Re: VMProtect 3.0
Не знаю как дела обстоят сейчас, но 3 года назад к примеру еще не было компилятора под х64 + компиляция под OSX была возможно только с использованием FireMonkey, который был еще жуткой сырой. Да и в целом кодогенерация под OSX ужасна до сих пор (про оптимизацию там походу ниразу не слышали).
Re: VMProtect 3.0
по вашему все в порядке ?
и с VMProtectDecryptStringA всегда креш ...
Re: VMProtect 3.0
VMProtectSDK, которую вы используете в проекте, на самом деле представляет из себя "пустышку":
В процессе обработки программы VMProtect добавляет в приложение уже реальный код, который тоже защищается виртуализацией (при этом удаляется зависимость от VMProtectSDKXX.dll). В результате итоговый размер программы может быть гораздо больше оригинала даже при включении упаковки. Добавление к размеру файлу + 1Мб - это в данном случае вполне нормально.
По поводу VMProtectDecryptStringA - присылайте тестовый пример (оригинальный EXE+MAP+VMP файлы).
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;
}
По поводу VMProtectDecryptStringA - присылайте тестовый пример (оригинальный EXE+MAP+VMP файлы).
Re: VMProtect 3.0
Спасибо за ответ . Сегодня проверил защищенный текст и оказалось не смотря на то, что в моей функции его нет, он остался в памяти приложения в открытом виде ... Даже после 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
- после очистки осталось половина текста.
vmp 3.0.5
-стринг остался без изменений + размер в 2 раза больше чем на vmp 2
вынужден использовать старую версию =(
в второй версии очистка стринга работает не как следует
но даже она лучше чем в третей версии !
исход
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
- после очистки осталось половина текста.
vmp 3.0.5
-стринг остался без изменений + размер в 2 раза больше чем на vmp 2
вынужден использовать старую версию =(
Re: VMProtect 3.0
Вы точно уверены, что в процессе работы MessageBoxA в системе не были созданы темповые строки, которые просто не успели "затереться" из-за недостаточной работой с кучей? У меня вот например нет такой уверенности. Для чистоты эксперимента я бы полностью исключил все промежуточные API:
И еще один момент. При нескольких вызовах VMProtectDecryptStringA с одной и тойже строкой VMProtect накручивает счетчик ссылок для результата и VMProtectFreeString полностью освободит строку только при условии, что счетчик ссылок будет равен 0:
В этом случае строка останется в памяти хотя результат от обоих VMProtectDecryptStringA будет одинаковым:
Code: Select all
char * param = VMProtectDecryptStringA("TEST PROTECTED STRING");
VMProtectFreeString(param);
В этом случае строка останется в памяти хотя результат от обоих VMProtectDecryptStringA будет одинаковым:
Code: Select all
char * param = VMProtectDecryptStringA("TEST PROTECTED STRING");
param = VMProtectDecryptStringA("TEST PROTECTED STRING");
VMProtectFreeString(param);