Вопрос по поводу исключений в x64

Уважаемый Admin, Вы, в одной из тем писали:
“В настоящий момент в х64 приложениях не поддерживается обработка исключений, все остальное работает.”

Что по этим подразумевается?
Потихоньку хочу осваивать 64 бита, начал с проверки всего так сказать технического инструментария…
Сперва решил проверить, как раз обработку исключений, ибо это часто очень важно!

В Delphi XE4 набросал тестовое приложение, как в 32 битном режиме, так и в 64 битном.
Приложение незамысловатое, 3 кнопки:

  1. Показ простого Show Message
  2. Простая ошибка TMemoryStream.WriteBuffer в несозданном объекте TMemoryStream
  3. Вызов кнопки номер 2, но в блоке try … except, с обработкой on E: Exception do

Кроме этого, включил EurekaLog 7 для отображения детальной информации об ошибках, стеке, и.т.д.
В 64 битном режиме, EL не показывает Asm код участка с ошибкой, видимо такие особенности.

И все работает!

Демки:
http://floomby.ru/s1/xY4y4w

А вот теперь попробуйте завиртуализировать функцию, в которой возникает исключение.

Сейчас попробую!

Да… И правда не работает… Приложение крашется…

Может быть есть какие то советы? Ведь падать на любой ошибке, даже в блоке try…except это печально…

А вообще…
Это временно? В будущем есть ли планы поправить ситуацию?

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

Есть ли надежда, что в VMProtect 3 ситуация наладиться?

Дело в том, что исключения в любом случае возникают в приложении, очень часто такие ошибки просто обрабатываются в блоке try…except и приложение нормально работает дальше…
Если приложение отваливается на любой ошибке, нет речи о поддержке 64 бит в VMProtect. Это скорее “баловство”.
Соответственно это

можно и убрать…

P.S.
Я очень доволен протектором в 32 битных приложениях. Мощный и удобный.
Но очень сильно растроился, когда хотел было осваивать 64 бита, а тут такое…
И что самое обидное, у ближайшего конкурента такая поддержка х64 есть… :frowning: :cry: (сам проверил на демо-версии сегодня)

P.S.S.
Желаю удачи в исследованиях в этой области! Чтобы все получилось достаточно быстро и “малой кровью”!

А кто у нас ближайший конкурент если не секрет?

Themida\WinLicense

Насколько я знаю у 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 не включается, а показывается сообщение об ошибке.

32 бита же, при водит к крашу…

Код компилировал в Delphi XE4.

Вот исходник и бинарники.
http://rghost.ru/47136111

32 бита же, при водит к крашу…

Ваш тестовый х64 тоже крешится. Ну и какой он нафиг конкурент? :slight_smile:)

Проверил на виртуальной Windows 8.1 x64 и основной Windows 7 x64 - 64 битное приложение, скомпилированное в 64 битной фемиде - работает!

P.S.
Если бы я считал достойным конкурентом продукцию Oreans, я бы не взял VMProtect. И не переживал бы за него. Но какую-то конкуренцию он составляет, а лучше него протекторов я не знаю. Всякие ASProtect не серьезно…

Проверил на виртуальной Windows 8.1 x64 и основной Windows 7 x64 - 64 битное приложение, скомпилированное в 64 битной фемиде - работает!

На моей Windows 7 x64 не работает - очередной минус продукту.

А Вы готовый бинарник использовали или заново собрали в фемиде? Дело в том, что демо-версия приложения криптует так, что на другом пк не работает программа и отображается окно что типа приложение собрано в демо-версии и работает только на том пк.

Обрабатывал заново демкой с оффсайта (2.2.3.0)

Ясно. Значит фемида действительно не дружит с исключениями…

А сейчас, придется отложить х64 до лучших времен.

Поддержка исключений для х64 реализована в версии 3.0

Когда будет релиз этой версии? Очень нуждаемся в поддержке исключений!

Мы планируем выпустить 3.0 в течение года.