2012-06-25 18 views
12

Für Windows 8 Anwendung Zertifizierung gibt es (unter anderem) diese Anforderungen:ermöglichen eine sichere Ausnahmebehandlung in C++ Builder

  • 3,2 Ihre App muss die /SafeSEH Flag kompiliert werden mit sicheren Ausnahmen gewährleisten Umgang
  • 3.3 Ihre Anwendung muss mit dem /NXCOMPAT Flag kompiliert werden, um die Datenausführungs
  • 3.4 Ihre Anwendung zu verhindern, muss mit dem /DYNAMICBASE Flag für die Randomisierung Adressraum Layout erstellt werden (ASLR)

Ich konnte nicht herausfinden, wie Sie in C++ Builder XE beide aktivieren.

Für /NXCOMPAT und /DYNAMICBASE kann man editbin.exe von VS oder peflags.exe von Cygwin verwenden. Obwohl ich mich sicherer über mögliche Nebenwirkungen fühlen würde, wenn es einen nativen Weg gäbe, diese zu ermöglichen.

Wie auch immer, ich bin völlig verloren in Bezug auf /SafeSEH.

+2

Natürlich erzeugt Delphi XE2 keine ausführbaren Dateien mit [Safe Exception Handler Tables] (http://www.jwsecure.com/2007/07/06/the-safe-exception-handler-table/). Ich habe keinen CPPBuilder, um das zu überprüfen, aber ich wette nicht. Ich denke, Sie werden kein Glück haben und sollten eine QC-Anfrage einreichen. Es kann tatsächlich sein, dass die strukturierten Exception-Handler sicher sind, aber das ist nicht viel für Sie nützlich, wenn die PE-Dateien nicht so markiert sind. Ihre 64-Bit-Apps sind in Ordnung, aber das ist in CPPBuilder noch nicht möglich. –

+0

Relevanter QC-Bericht: http://qc.embarcadero.com/wc/qcmain.aspx?d=106781 –

Antwort

4

Erstens,/SafeSEH gilt nur für x86, nicht für x64 oder ARM. Es erfordert, dass Ihr Compiler zusätzliche Tabellen generiert, die die Funktionsadressen angeben, die aus Sicherheitsgründen als gültige Ausnahmehandler betrachtet werden. Es gibt eine geringe Chance, dass Sie dies selbst tun könnten, aber es würde erfordern, dass Sie die Ausnahmebehandlungskette fs:0 in Ihrem kompilierten Assemblycode betrachten und alle Adressen auflisten, die jemals auf dieser Kette geschoben wurden, und sie dann wie hier dokumentiert beschreiben: http://msdn.microsoft.com/en-us/library/9a89h429(v=VS.80).aspx. Es gibt eine (geringe) Chance, dass Ihr Code tatsächlich keine Handler hat und sie alle in der C++ Builder-Laufzeitumgebung enthalten sind (möglicherweise, wenn die Laufzeitumgebung eine separate DLL ist).

Sie sollten versuchen, C++ Builder zu überreden, ihren Compiler zur Unterstützung von SafeSEH zu aktualisieren. Es ist in der Windows-Plattform seit XP SP2, und steckt eine ziemlich unangenehme Sicherheitslücke (Exception-Handler-Adressen existieren auf dem Stapel in x86, nur auf einen Pufferüberlauf warten, um beliebige zufällige Adresse dort ausgeführt werden)

1

Für das Problem im Zusammenhang mit /NXCOMPAT und /DYNAMICBASE, habe ich eine Anfrage für den C++ Builder-Linker diese Flags hier geschaffen haben zu unterstützen: https://quality.embarcadero.com/browse/RSP-13072

editbin.exe von Visual C++ zu verwenden ist kaum eine ideale Lösung, und ihre Linker muss diese Flags nativ unterstützen.

UPDATE: Eine zusätzliche Anforderung hier für die C++ Builder/Delphi-Laufzeitdateien erstellt wurde (DLLs/BPLs) mit diesen Flags bereits gesetzt verteilt werden, um zu vermeiden, EDITBIN von Visual C++ verwenden einzustellen sie selbst: https://quality.embarcadero.com/browse/RSP-13231