2012-06-25 2 views
12

Для сертификации 8 приложений Windows, есть (среди прочих) эти требования:Включить безопасный Обработка исключений в C++ Builder

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

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

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

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

+2

Конечно, Delphi XE2 не создает исполняемые файлы с помощью [Таблицы обработчика безопасного исключения] (http://www.jwsecure.com/2007/07/06/the-safe-exception-handler-table/). У меня нет CPPBuilder, чтобы проверить это, но я бы сделал ставку не на то. Я думаю, вам будет не повезло, и вы должны отправить запрос QC. На самом деле может быть, что структурированные обработчики исключений безопасны, но для вас это не очень удобно, если файлы PE не отмечены так, чтобы это можно было сказать. Ваши 64-разрядные приложения будут в порядке, но это также невозможно в CPPBuilder. –

+0

Соответствующий отчет QC: http://qc.embarcadero.com/wc/qcmain.aspx?d=106781 –

ответ

4

Во-первых, 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, просто ожидая переполнения буфера, чтобы поставить любой случайный адрес там, который должен быть выполнен)

1

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

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

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

Смежные вопросы