Подтвердить что ты не робот

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

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

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

Мне не удалось выяснить, как включить любой из них в С++ Builder XE.

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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