Уважаемый Admin, Вы, в одной из тем писали:
“В настоящий момент в х64 приложениях не поддерживается обработка исключений, все остальное работает.”
Что по этим подразумевается?
Потихоньку хочу осваивать 64 бита, начал с проверки всего так сказать технического инструментария…
Сперва решил проверить, как раз обработку исключений, ибо это часто очень важно!
В Delphi XE4 набросал тестовое приложение, как в 32 битном режиме, так и в 64 битном.
Приложение незамысловатое, 3 кнопки:
Показ простого Show Message
Простая ошибка TMemoryStream.WriteBuffer в несозданном объекте TMemoryStream
Вызов кнопки номер 2, но в блоке try … except, с обработкой on E: Exception do
Кроме этого, включил EurekaLog 7 для отображения детальной информации об ошибках, стеке, и.т.д.
В 64 битном режиме, EL не показывает Asm код участка с ошибкой, видимо такие особенности.
Общая ситуация ухудшается еще тем, что при виртуализации любой функции вверх по стеку вызовов при возникновении исключения процесс будет падать, т.к. механизм работы исключений в х64 очень сильно отличается от х32. Каждая функция имеет информацию о регионах адресов, в которых она живет, а также дополнительную информация по раскрутке стека. Дак вот при виртуализации кода исключение возникает уже совершенно по другому адресу, для которого система не может найти никакой информации ни об обработчике исключений, ни об информации по раскрутке стека. Когда будет сделана полноценна обработка исключений - неизвестно. Нужно проводить исследования.
Есть ли надежда, что в VMProtect 3 ситуация наладиться?
Дело в том, что исключения в любом случае возникают в приложении, очень часто такие ошибки просто обрабатываются в блоке try…except и приложение нормально работает дальше…
Если приложение отваливается на любой ошибке, нет речи о поддержке 64 бит в VMProtect. Это скорее “баловство”.
Соответственно это
можно и убрать…
P.S.
Я очень доволен протектором в 32 битных приложениях. Мощный и удобный.
Но очень сильно растроился, когда хотел было осваивать 64 бита, а тут такое…
И что самое обидное, у ближайшего конкурента такая поддержка х64 есть… (сам проверил на демо-версии сегодня)
P.S.S.
Желаю удачи в исследованиях в этой области! Чтобы все получилось достаточно быстро и “малой кровью”!
Насколько я знаю у Themida не поддерживаются исключения даже в х32. Думал что-то изменилось в последних версиях - ожидания не оправдались, падает как в х64 так и в х32.
Код на Delphi:
procedure TForm19.Button1Click(Sender: TObject);
var I:Integer;
begin
{$I VM_Start.inc};
I := Random(100);
if (I <> -1) then
I := 0;
try
Application.MessageBox('try', '', MB_OK + MB_ICONSTOP);
Caption:=IntToStr(Round(500/I));
except
Application.MessageBox('catch', '', MB_OK + MB_ICONSTOP);
end;
Application.MessageBox('end', '', MB_OK + MB_ICONSTOP);
{$I VM_End.inc};
end;
Код на C++:
int _tmain(int argc, _TCHAR* argv[])
{
VMStart();
int i = __rdtsc();
if (i != -1)
i = 0;
printf("try 1\n");
try {
printf("%d\n", 500 / i);
} catch(...) {
printf("catch 1\n");
}
printf("end 1\n");
VMEnd();
return 0;
}
Если приложение отваливается на любой ошибке, нет речи о поддержке 64 бит в VMProtect. Это скорее “баловство”.
Следуя вашей логике Themida - это “баловство” даже для х32 кода.
Досконально протестировал демки Themida. Как 32 битную, так и 64 битную… (Они отдельно скачиваются)
Знаете что самое интересное!
64 бита действительно работает, правда с небольшими оговорками, блок try..except не включается, а показывается сообщение об ошибке.
Проверил на виртуальной Windows 8.1 x64 и основной Windows 7 x64 - 64 битное приложение, скомпилированное в 64 битной фемиде - работает!
P.S.
Если бы я считал достойным конкурентом продукцию Oreans, я бы не взял VMProtect. И не переживал бы за него. Но какую-то конкуренцию он составляет, а лучше него протекторов я не знаю. Всякие ASProtect не серьезно…
А Вы готовый бинарник использовали или заново собрали в фемиде? Дело в том, что демо-версия приложения криптует так, что на другом пк не работает программа и отображается окно что типа приложение собрано в демо-версии и работает только на том пк.