Share via


/guard:ehcont (Povolení metadat pokračování EH)

Umožňuje generování metadat pokračování EH (EHCONT) kompilátorem.

Syntaxe

/guard:ehcont[-]

Poznámky

Tato /guard:ehcont možnost způsobí, že kompilátor vygeneruje seřazený seznam relativních virtuálních adres (RVA) všech platných cílů pokračování zpracování výjimek pro binární soubor. Používá se během běhu pro NtContinueSetThreadContext ověření ukazatele instrukce. Ve výchozím nastavení /guard:ehcont je vypnutá a musí být explicitně povolená. Pokud chcete tuto možnost explicitně zakázat, použijte /guard:ehcont-.

Tato /guard:ehcont možnost je dostupná v sadě Visual Studio 2019 verze 16.7 a novější. Tato funkce je podporována pro 64bitové procesy v 64bitovém operačním systému.

Technologie CET (Control-Flow Enforcement Technology) je hardwarová funkce zabezpečení, která chrání proti útokům založeným na ROP (Return-Oriented Programming). Udržuje "stínový zásobník" pro každý zásobník volání k vynucení integrity toku řízení.

Pokud jsou stínové zásobníky k dispozici, aby se zabránilo útokům ROP, útočníci se přesouvají k používání dalších technik zneužití. Jednou z technik, kterou mohou použít, je poškodit hodnotu ukazatele instrukce uvnitř struktury CONTEXT . Tato struktura se předává do systémových volání, která přesměrovávají provádění vlákna, například NtContinue, RtlRestoreContexta SetThreadContext. Struktura CONTEXT je uložena v paměti. Poškození ukazatele instrukce, který obsahuje, může způsobit, že systémová volání přenesou spuštění na adresu řízenou útočníkem. NTContinue V současné době je možné volat s jakýmkoli bodem pokračování. Proto je důležité ověřit instrukční ukazatel, když jsou povoleny stínové zásobníky.

RtlRestoreContext a NtContinue používají se při odvíjení výjimky strukturovaného zpracování výjimek (SEH) k odvíjení do cílového __except rámce, který obsahuje blok. Ukazatel __except instrukce bloku se neočekává, že bude ve stínovém zásobníku, protože by se nezdařilo ověření ukazatele instrukce. Přepínač /guard:ehcont kompilátoru vygeneruje tabulku pokračování EH. Obsahuje seřazený seznam RVA všech platných cílů pokračování zpracování výjimek v binární soustavě. NtContinue Nejprve zkontroluje stínový zásobník pro ukazatel instrukce zadaný uživatelem a pokud tam není nalezen ukazatel instrukce, pokračuje kontrolou tabulky pokračování EH z binárního souboru, který obsahuje ukazatel instrukce. Pokud se soubor obsahující binární soubor nezkompiloval s tabulkou, bude možné pokračovat v kompatibilitě se staršími binárními soubory NtContinue . Je důležité rozlišovat mezi staršími binárními soubory, které nemají žádná data EHCONT, a binární soubory obsahující data EHCONT, ale žádné položky tabulky. První možnost povoluje všechny adresy uvnitř binárního souboru jako platné cíle pokračování. Druhá možnost nepovoluje žádnou adresu uvnitř binárního souboru jako platný cíl pokračování.

Možnost /guard:ehcont musí být předána kompilátoru i linkeru, aby se pro binární soubor vygenerovaly cíle pokračování EH. Pokud je binární soubor sestaven pomocí jednoho cl příkazu, kompilátor předá možnost linkeru. Kompilátor také předá /guard:cf možnost linkeru. Pokud kompilujete a propojit samostatně, musí být tyto možnosti nastaveny na příkazy kompilátoru i linkeru.

Kód zkompilovaný pomocí /guard:ehcont knihoven a souborů objektů zkompilovaných bez něj můžete propojit. Linker vrátí závažnou chybu v některém z těchto scénářů:

  • Oddíl kódu má "místní odvíjení". Další informace naleznete v části Neobvyklé ukončení v příkazu try-finally.

  • Oddíl EH (xdata) obsahuje ukazatele na oddíl kódu a nejsou určené pro SEH.

  • Ukazatele jsou pro SEH, ale soubor objektu nebyl zkompilován pomocí propojení na úrovni funkce (/Gy) k vytvoření comDATs.

Linker vrátí závažnou chybu, protože v těchto scénářích nemůže generovat metadata. To znamená, že vyvolání výjimky pravděpodobně způsobí chybové ukončení za běhu.

Informace o oddílu SEH nalezené v comDATs, ale nejsou zkompilovány pomocí /guard:ehcont, linker generuje upozornění LNK4291. V tomto případě linker vygeneruje správná, ale konzervativní metadata pro oddíl. Pokud chcete toto upozornění ignorovat, použijte příkaz /IGNORE (ignorovat konkrétní upozornění).

Pokud linker nemůže generovat metadata, vygeneruje jednu z následujících chyb:

  • 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.

Pokud chcete zkontrolovat, jestli binární soubor obsahuje data EHCONT, vyhledejte při výpisu konfigurace načtení binárního souboru následující prvky:

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
...

Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností vlastnosti konfigurace>C/C++>Generování kódu.

  3. Vyberte vlastnost Povolit metadata pokračování EH.

  4. V ovládacím prvku rozevíracího seznamu zvolte Ano (/guard:ehcont), pokud chcete povolit metadata pokračování EH nebo ne (/guard:ehcont-) a zakažte ho.

Viz také

/guard (povolení ochrany toku řízení)
Parametry kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC