Bagikan melalui


/guard:ehcont (Aktifkan Metadata Kelanjutan EH)

Memungkinkan pembuatan metadata EH Continuation (EHCONT) oleh pengkompilasi.

Sintaks

/guard:ehcont[-]

Keterangan

Opsi /guard:ehcont ini menyebabkan pengkompilasi menghasilkan daftar yang diurutkan dari alamat virtual relatif (RVA) dari semua target kelanjutan penanganan pengecualian yang valid untuk biner. Ini digunakan selama runtime untuk NtContinue dan SetThreadContext validasi pointer instruksi. Secara default, /guard:ehcont nonaktif dan harus diaktifkan secara eksplisit. Untuk menonaktifkan opsi ini secara eksplisit, gunakan /guard:ehcont-.

Opsi /guard:ehcont ini tersedia di Visual Studio 2019 versi 16.7 dan yang lebih baru. Fitur ini didukung untuk proses 64-bit pada OS 64-bit.

Control-flow Enforcement Technology (CET) adalah fitur keamanan berbasis perangkat keras yang melindungi dari serangan berbasis Return-Oriented Programming (ROP). Ini mempertahankan "tumpukan bayangan" untuk setiap tumpukan panggilan untuk menerapkan integritas aliran kontrol.

Ketika tumpukan bayangan tersedia untuk mencegah serangan ROP, penyerang melanjutkan untuk menggunakan teknik eksploitasi lainnya. Salah satu teknik yang dapat mereka gunakan adalah merusak nilai penunjuk instruksi di dalam struktur CONTEXT . Struktur ini diteruskan ke panggilan sistem yang mengalihkan eksekusi utas, seperti NtContinue, , RtlRestoreContextdan SetThreadContext. Struktur CONTEXT disimpan dalam memori. Merusak pointer instruksi yang dikandungnya dapat menyebabkan panggilan sistem mentransfer eksekusi ke alamat yang dikontrol penyerang. Saat ini, NTContinue dapat dipanggil dengan titik kelanjutan apa pun. Itulah sebabnya penting untuk memvalidasi penunjuk instruksi ketika tumpukan bayangan diaktifkan.

RtlRestoreContext dan NtContinue digunakan selama pengecualian Structured Exception Handling (SEH) melepas penat untuk melepas ke bingkai target yang berisi __except blok. Penunjuk __except instruksi blok tidak diharapkan berada di tumpukan bayangan, karena akan gagal dalam validasi pointer instruksi. Sakelar /guard:ehcont kompilator menghasilkan "Tabel Kelanjutan EH". Ini berisi daftar RVA yang diurutkan dari semua target kelanjutan penanganan pengecualian yang valid dalam biner. NtContinue pertama-tama memeriksa tumpukan bayangan untuk penunjuk instruksi yang disediakan pengguna, dan jika penunjuk instruksi tidak ditemukan di sana, ia melanjutkan untuk memeriksa Tabel Kelanjutan EH dari biner yang berisi penunjuk instruksi. Jika biner yang berisi tidak dikompilasi dengan tabel, maka untuk kompatibilitas dengan biner warisan, NtContinue diizinkan untuk melanjutkan. Penting untuk membedakan antara biner warisan yang tidak memiliki data EHCONT, dan biner yang berisi data EHCONT tetapi tidak ada entri tabel. Yang pertama memungkinkan semua alamat di dalam biner sebagai target kelanjutan yang valid. Yang terakhir tidak mengizinkan alamat apa pun di dalam biner sebagai target kelanjutan yang valid.

Opsi /guard:ehcont harus diteruskan ke compiler dan linker untuk menghasilkan RVA target kelanjutan EH untuk biner. Jika biner Anda dibangun dengan menggunakan satu cl perintah, pengkompilasi meneruskan opsi ke linker. Pengkompilasi juga meneruskan /guard:cf opsi ke linker. Jika Anda mengkompilasi dan menautkan secara terpisah, opsi ini harus diatur pada perintah compiler dan linker.

Anda dapat menautkan kode yang dikompilasi dengan menggunakan /guard:ehcont ke pustaka dan file objek yang dikompilasi tanpanya. Linker mengembalikan kesalahan fatal dalam salah satu skenario ini:

  • Bagian kode memiliki "unwind lokal". Untuk informasi selengkapnya, lihat Penghentian abnormal dalam Pernyataan try-finally.

  • Bagian EH (xdata) berisi penunjuk ke bagian kode, dan bukan untuk SEH.

  • Pointer adalah untuk SEH, tetapi file objek tidak dikompilasi menggunakan penautan tingkat fungsi (/Gy) untuk menghasilkan COMDAT.

Linker mengembalikan kesalahan fatal, karena tidak dapat menghasilkan metadata dalam skenario ini. Itu berarti melemparkan pengecualian kemungkinan menyebabkan crash pada waktu proses.

Untuk info bagian SEH yang ditemukan di COMDATs, tetapi tidak dikompilasi menggunakan /guard:ehcont, linker mengeluarkan peringatan LNK4291. Dalam hal ini, linker menghasilkan metadata yang benar tetapi konservatif untuk bagian tersebut. Untuk mengabaikan peringatan ini, gunakan /IGNORE (Abaikan Peringatan Tertentu).

Jika linker tidak dapat menghasilkan metadata, itu memancarkan salah satu kesalahan berikut:

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

Untuk memeriksa apakah biner berisi data EHCONT, cari elemen berikut saat mencadangkan konfigurasi beban biner:

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

Untuk mengatur opsi pengkompilasi ini di lingkungan pengembangan Visual Studio

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Code Generation.

  3. Pilih properti Aktifkan Metadata Kelanjutan EH.

  4. Di kontrol dropdown, pilih Ya (/guard:ehcont) untuk mengaktifkan metadata kelanjutan EH, atau Tidak (/guard:ehcont-) untuk menonaktifkannya.

Lihat juga

/guard (Aktifkan Control Flow Guard)
Opsi Pengkompilasi MSVC
Sintaks Baris Perintah Pengkompilasi MSVC