/guard:ehcont
(EH-Fortsetzungsmetadaten aktivieren)
Ermöglicht die Generierung von EH-Fortsetzungsmetadaten (EHCONT) durch den Compiler.
Syntax
/guard:ehcont
[-
]
Hinweise
Die /guard:ehcont
Option bewirkt, dass der Compiler eine sortierte Liste der relativen virtuellen Adressen (RVA) aller gültigen Fortsetzungsziele für die Ausnahmebehandlung für eine Binärdatei generiert. Sie wird während der Laufzeit für die Überprüfung von Zeigern und NtContinue
SetThreadContext
Anweisungen verwendet. Ist standardmäßig /guard:ehcont
deaktiviert und muss explizit aktiviert sein. Um diese Option explizit zu deaktivieren, verwenden Sie /guard:ehcont-
.
Die /guard:ehcont
Option ist in Visual Studio 2019, Version 16.7 und höher, verfügbar. Das Feature wird für 64-Bit-Prozesse auf einem 64-Bit-Betriebssystem unterstützt.
Die Durchsetzungstechnologie (Control-Flow Enforcement Technology, CET) ist ein hardwarebasiertes Sicherheitsfeature, das vor Return-Oriented Programming (ROP)-basierten Angriffen schützt. Es verwaltet einen "Schattenstapel" für jeden Aufrufstapel, um die Steuerungsflussintegrität zu erzwingen.
Wenn Schattenstapel verfügbar sind, um ROP-Angriffe zu verhindern, setzen sich Angreifer fort, um andere Exploit-Techniken zu verwenden. Eine Technik, die sie verwenden können, besteht darin, den Anweisungszeigerwert innerhalb der CONTEXT-Struktur zu beschädigen. Diese Struktur wird an Systemaufrufe übergeben, die die Ausführung eines Threads umleiten, z NtContinue
. B. , RtlRestoreContext
und SetThreadContext
. Die CONTEXT
Struktur wird im Arbeitsspeicher gespeichert. Das Beschädigten des darin enthaltenen Anweisungspunkts kann dazu führen, dass die Systemaufrufe die Ausführung an eine vom Angreifer kontrollierte Adresse übertragen. NTContinue
Derzeit kann mit jedem Fortsetzungspunkt aufgerufen werden. Deshalb ist es wichtig, den Anweisungszeiger zu überprüfen, wenn Schattenstapel aktiviert sind.
RtlRestoreContext
und NtContinue
werden während der Behandlung von strukturierten Ausnahmen (Structured Exception Handling, SEH) verwendet, um sich auf den Zielframe zu entspannen, der den __except
Block enthält. Der Anweisungszeiger des __except
Blocks wird nicht erwartet, dass er sich auf dem Schattenstapel befindet, da die Überprüfung des Anweisungspunkts fehlschlägt. Der /guard:ehcont
Compilerschalter generiert eine "EH-Fortsetzungstabelle". Sie enthält eine sortierte Liste der RVAs aller gültigen Fortsetzungsziele für die Ausnahmebehandlung in der Binärdatei. NtContinue
überprüft zuerst den Schattenstapel für den vom Benutzer bereitgestellten Anweisungszeiger. Wenn der Anweisungszeiger dort nicht gefunden wird, wird die EH-Fortsetzungstabelle aus der Binärdatei überprüft, die den Anweisungszeiger enthält. Wenn die enthaltende Binärdatei nicht mit der Tabelle kompiliert wurde, darf die Kompatibilität mit älteren Binärdateien NtContinue
fortgesetzt werden. Es ist wichtig, zwischen Legacybinärdateien zu unterscheiden, die keine EHCONT-Daten enthalten, und Binärdateien, die EHCONT-Daten enthalten, aber keine Tabelleneinträge. Der frühere Wert lässt alle Adressen innerhalb der Binärdatei als gültige Fortsetzungsziele zu. Letzteres lässt keine Adresse innerhalb der Binärdatei als gültiges Fortsetzungsziel zu.
Die /guard:ehcont
Option muss sowohl an den Compiler als auch an den Linker übergeben werden, um EH-Fortsetzungsziel-RVAs für eine Binärdatei zu generieren. Wenn die Binärdatei mit einem einzigen cl
-Befehl erstellt wird, übergibt der Compiler die Option an den Linker. Der Compiler übergibt auch die /guard:cf
Option an den Linker. Wenn Sie separat kompilieren und verknüpfen, müssen diese Optionen sowohl für die Compiler- als auch die Linkerbefehle festgelegt werden.
Sie können Code verknüpfen, der mithilfe von /guard:ehcont
Bibliotheken und Objektdateien kompiliert wird, ohne ihn kompiliert werden. Der Linker gibt in einem der folgenden Szenarien einen schwerwiegenden Fehler zurück:
Ein Codeabschnitt hat "lokales Entspannen". Weitere Informationen finden Sie unter "Abnorme Beendigung" in der try-finally-Anweisung.
Ein EH(xdata)-Abschnitt enthält Zeiger auf einen Codeabschnitt, und sie sind nicht für SEH vorgesehen.
Die Zeiger sind für SEH vorgesehen, die Objektdatei wurde jedoch nicht mithilfe von Verknüpfungen auf Funktionsebene (/Gy) kompiliert, um COMDATs zu erzeugen.
Der Linker gibt einen schwerwiegenden Fehler zurück, da er in diesen Szenarien keine Metadaten generieren kann. Das bedeutet, dass das Auslösen einer Ausnahme wahrscheinlich zu einem Absturz zur Laufzeit führt.
Für SEH-Abschnittsinformationen, die in COMDATs gefunden, jedoch nicht mithilfe /guard:ehcont
kompiliert werden, gibt der Linker Warnung LNK4291 aus. In diesem Fall generiert der Linker die richtigen, aber konservativen Metadaten für den Abschnitt. Um diese Warnung zu ignorieren, verwenden Sie /IGNORE (Bestimmte Warnungen ignorieren).
Wenn der Linker keine Metadaten generieren kann, gibt er einen der folgenden Fehler aus:
LNK2046: module contains _local_unwind but was not compiled with /guard:ehcont
LNK2047: module contains C++ EH or complex EH metadata but was not compiled with /guard:ehcont.
Um zu überprüfen, ob eine Binärdatei EHCONT-Daten enthält, suchen Sie beim Dumping der Ladekonfiguration der Binärdatei nach den folgenden Elementen:
e:\>link /dump /loadconfig CETTest.exe
...
10417500 Guard Flags
...
EH Continuation table present // EHCONT guard flag present
...
0000000180018640 Guard EH continuation table
37 Guard EH continuation count // May be 0 if no exception handling is used in the binary. Still counts has having EHCONT data.
...
Guard EH Continuation Table // List of RVAs
Address
--------
0000000180002CF5
0000000180002F03
0000000180002F0A
...
So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).
Wählen Sie die Eigenschaftenseite Konfigurationseigenschaften>C/C++>Codegenerierung aus.
Wählen Sie die Eigenschaft "EH-Fortsetzungsmetadaten aktivieren" aus.
Wählen Sie im Dropdownsteuerelement "Ja" (/guard:ehcont) aus, um EH-Fortsetzungsmetadaten zu aktivieren, oder "Nein" (/guard:ehcont-), um es zu deaktivieren.
Siehe auch
/guard (Ablaufsteuerungsschutz aktivieren)
MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile