Включить безопасную обработку исключений в C++ Builder

для сертификации приложений Windows 8 существуют (среди прочего) следующие требования:

  • 3.2 ваше приложение должно быть скомпилировано с помощью /SafeSEH флаг для обеспечения безопасной обработки исключений
  • 3.3 ваше приложение должно быть скомпилировано с помощью /NXCOMPAT флаг для предотвращения выполнения данных
  • 3.4 ваше приложение должно быть скомпилировано с помощью /DYNAMICBASE флаг для рандомизации макета адресного пространства (ASLR)

Я не смог найти, Как включить любой из них в C++Builder XE.

на /NXCOMPAT и /DYNAMICBASE можно использовать editbin.exe от VS или peflags.exe из Cygwin. Хотя я был бы более уверен в возможных побочных эффектах, если бы был родной способ включить их.

в любом случае, я полностью в недоумении относительно /SafeSEH.

2 ответов


во-первых, /SafeSEH применяется только к x86, а не x64 или ARM. Это требует, чтобы компилятор создавал дополнительные таблицы, указывающие адреса функций, которые считаются допустимыми обработчиками исключений по соображениям безопасности. Есть небольшой шанс, что вы могли бы сделать это сами, но это потребует, чтобы вы посмотрели на fs:0 цепочка обработки исключений в скомпилированном коде сборки и перечислите все адреса, которые когда-либо были нажаты в этой цепочке, а затем опишите их, как описано здесь: http://msdn.microsoft.com/en-us/library/9a89h429 (v=VS.80).aspx. Существует (тонкий) шанс, что ваш код на самом деле не имеет никаких обработчиков, и все они находятся во время выполнения C++Builder (может облегчить работу, если среда выполнения является отдельной DLL).

вы должны попытаться убедить C++Builder обновить свой компилятор для поддержки SafeSEH. Он был вокруг в платформе Windows с XP SP2 и подключает довольно неприятную дыру безопасности (адреса обработчиков исключений существуют в стеке в x86, просто ожидая переполнения буфера, чтобы поместить любой случайный адрес там, чтобы быть выполненным)


на вопрос /NXCOMPAT и /DYNAMICBASE, Я создал запрос для компоновщика C++ Builder для поддержки этих флагов здесь:https://quality.embarcadero.com/browse/RSP-13072

используя editbin.exe из Visual C++ вряд ли является идеальным решением, и их компоновщик должен поддерживать эти флаги изначально.

обновление: здесь был создан дополнительный запрос на распространение файлов среды выполнения C++ Builder / Delphi (DLL / BPLs) с этими флагами уже установлены, чтобы избежать необходимости использовать EDITBIN из Visual C++, чтобы установить их самостоятельно:https://quality.embarcadero.com/browse/RSP-13231