Udostępnij za pośrednictwem


/guard:ehcont (Włącz metadane kontynuacji EH)

Umożliwia generowanie metadanych kontynuacji EH (EHCONT) przez kompilator.

Składnia

/guard:ehcont[-]

Uwagi

Opcja /guard:ehcont powoduje, że kompilator generuje posortowaną listę względnych adresów wirtualnych (RVA) wszystkich prawidłowych elementów docelowych kontynuacji wyjątków dla pliku binarnego. Jest on używany w czasie wykonywania do NtContinue sprawdzania poprawności wskaźnika instrukcji i SetThreadContext . Domyślnie /guard:ehcont jest wyłączona i musi być jawnie włączona. Aby jawnie wyłączyć tę opcję, użyj polecenia /guard:ehcont-.

Opcja /guard:ehcont jest dostępna w programie Visual Studio 2019 w wersji 16.7 lub nowszej. Ta funkcja jest obsługiwana w przypadku procesów 64-bitowych w 64-bitowym systemie operacyjnym.

Control-flow Enforcement Technology (CET) to funkcja zabezpieczeń oparta na sprzęcie, która chroni przed atakami opartymi na programowania zwrotnego (ROP). Utrzymuje on "stos w tle" dla każdego stosu wywołań w celu wymuszania integralności przepływu sterowania.

Gdy stosy w tle są dostępne w celu zapobiegania atakom ROP, osoby atakujące przechodzą do korzystania z innych technik wykorzystujących luki w zabezpieczeniach. Jedną z technik, których mogą używać, jest uszkodzenie wartości wskaźnika instrukcji wewnątrz struktury CONTEXT . Ta struktura jest przekazywana do wywołań systemowych, które przekierowuje wykonywanie wątku, takiego jak NtContinue, RtlRestoreContexti SetThreadContext. Struktura CONTEXT jest przechowywana w pamięci. Uszkodzenie wskaźnika instrukcji, który zawiera, może spowodować wywołania systemu w celu przeniesienia wykonania na adres kontrolowany przez osobę atakującą. NTContinue Obecnie można wywołać metodę z dowolnym punktem kontynuacji. Dlatego ważne jest zweryfikowanie wskaźnika instrukcji po włączeniu stosów w tle.

RtlRestoreContext i NtContinue są używane podczas obsługi wyjątków strukturalnych (SEH) odwijania się do ramki docelowej, która zawiera __except blok. Wskaźnik instrukcji __except bloku nie powinien znajdować się w stosie w tle, ponieważ walidacja wskaźnika instrukcji zakończy się niepowodzeniem. Przełącznik kompilatora /guard:ehcont generuje tabelę kontynuacji EH. Zawiera posortowaną listę obiektów RVA wszystkich prawidłowych obiektów docelowych kontynuacji wyjątków w pliku binarnym. NtContinue Najpierw sprawdza stos w tle dla wskaźnika instrukcji dostarczonej przez użytkownika, a jeśli wskaźnik instrukcji nie zostanie tam znaleziony, przejdzie do sprawdzenia tabeli kontynuacji EH z pliku binarnego zawierającego wskaźnik instrukcji. Jeśli plik binarny zawierający nie został skompilowany z tabelą, w celu zachowania zgodności ze starszymi plikami binarnymi NtContinue można kontynuować. Ważne jest, aby odróżnić starsze pliki binarne, które nie mają danych EHCONT, a pliki binarne zawierające dane EHCONT, ale bez wpisów tabeli. Pierwsza zezwala na wszystkie adresy wewnątrz pliku binarnego jako prawidłowe obiekty docelowe kontynuacji. Ten ostatni nie zezwala na żaden adres wewnątrz pliku binarnego jako prawidłowy element docelowy kontynuacji.

Opcja /guard:ehcont musi zostać przekazana zarówno do kompilatora, jak i konsolidatora, aby wygenerować docelowe RVA kontynuacji EH dla pliku binarnego. Jeśli plik binarny jest kompilowany przy użyciu jednego cl polecenia, kompilator przekazuje opcję konsolidatorowi. Kompilator przekazuje /guard:cf również opcję konsolidatorowi. Jeśli kompilujesz i łączysz oddzielnie, te opcje muszą być ustawione zarówno w poleceniach kompilatora, jak i konsolidatora.

Kod skompilowany za pomocą polecenia można połączyć z /guard:ehcont bibliotekami i plikami obiektów skompilowanymi bez niego. Konsolidator zwraca błąd krytyczny w dowolnym z tych scenariuszy:

  • Sekcja kodu zawiera "lokalne odwijaj się". Aby uzyskać więcej informacji, zobacz Nieprawidłowe zakończenie w instrukcji try-finally.

  • Sekcja EH (xdata) zawiera wskaźniki do sekcji kodu i nie są przeznaczone dla protokołu SEH.

  • Wskaźniki są przeznaczone dla SEH, ale plik obiektu nie został skompilowany przy użyciu łączenia na poziomie funkcji (/Gy) do tworzenia comDATs.

Konsolidator zwraca błąd krytyczny, ponieważ nie może wygenerować metadanych w tych scenariuszach. Oznacza to, że zgłoszenie wyjątku może spowodować awarię w czasie wykonywania.

W przypadku informacji o sekcji SEH znalezionych w comDATs, ale nie skompilowanych przy użyciu polecenia /guard:ehcont, konsolidator emituje ostrzeżenie LNK4291. W takim przypadku konsolidator generuje poprawne, ale konserwatywne metadane sekcji. Aby zignorować to ostrzeżenie, użyj / IGNORE (Ignoruj określone ostrzeżenia).

Jeśli konsolidator nie może wygenerować metadanych, emituje jeden z następujących błędów:

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

Aby sprawdzić, czy plik binarny zawiera dane EHCONT, poszukaj następujących elementów podczas dumpingu konfiguracji obciążenia pliku binarnego:

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

Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).

  2. Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Code Generation.

  3. Wybierz właściwość Włącz metadane kontynuacji EH.

  4. W kontrolce listy rozwijanej wybierz pozycję Tak (/guard:ehcont), aby włączyć metadane kontynuacji EH lub nie (/guard:ehcont-), aby ją wyłączyć.

Zobacz też

/guard (Włącz ochronę przepływu sterowania)
Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC