/guard:ehcont (EH Devamlılık Meta Verilerini Etkinleştir)

Derleyici tarafından EH Continuation (EHCONT) meta verilerinin oluşturulmasını etkinleştirir.

Sözdizimi

/guard:ehcont[-]

Açıklamalar

seçeneği, /guard:ehcont derleyicinin bir ikili için tüm geçerli özel durum işleme devamlılık hedeflerinin göreli sanal adreslerinin (RVA) sıralanmış listesini oluşturmasına neden olur. Ve yönerge işaretçisi doğrulaması için NtContinueSetThreadContext çalışma zamanı sırasında kullanılır. Varsayılan olarak kapalıdır /guard:ehcont ve açıkça etkinleştirilmesi gerekir. Bu seçeneği açıkça devre dışı bırakmak için kullanın /guard:ehcont-.

Bu /guard:ehcont seçenek Visual Studio 2019 sürüm 16.7 ve sonraki sürümlerde kullanılabilir. Bu özellik, 64 bit işletim sistemindeki 64 bit işlemler için desteklenir.

Denetim Akışı Zorlama Teknolojisi (CET), Dönüş Odaklı Programlama (ROP) tabanlı saldırılara karşı koruma sağlayan donanım tabanlı bir güvenlik özelliğidir. Denetim akışı bütünlüğünü zorlamak için her çağrı yığını için bir "gölge yığın" tutar.

ROP saldırılarını önlemek için gölge yığınlar kullanılabilir olduğunda, saldırganlar diğer açıklardan yararlanma tekniklerini kullanmaya devam eder. Kullanabilecekleri bir teknik, BAĞLAM yapısı içindeki yönerge işaretçisi değerini bozmaktır. Bu yapı, , RtlRestoreContextve SetThreadContextgibi NtContinuebir iş parçacığının yürütülmesini yeniden yönlendiren sistem çağrılarına geçirilir. Yapı CONTEXT bellekte depolanır. içerdiği yönerge işaretçisinin bozulması, sistem çağrılarının yürütmeyi saldırgan denetimindeki bir adrese aktarmasına neden olabilir. Şu anda herhangi NTContinue bir devamlılık noktası ile çağrılabilir. Bu nedenle, gölge yığınlar etkinleştirildiğinde yönerge işaretçisini doğrulamak önemlidir.

RtlRestoreContext ve NtContinue blok içeren __except hedef çerçeveye geri sarmak için Yapılandırılmış Özel Durum İşleme (SEH) özel durumunun geri alınması sırasında kullanılır. Yönerge işaretçisi doğrulaması başarısız olacağından bloğun __except yönerge işaretçisinin gölge yığında olması beklenmemektedir. Derleyici /guard:ehcont anahtarı bir "EH Continuation Table" oluşturur. İkili dosyadaki tüm geçerli özel durum işleme devamlılık hedeflerinin RVA'larının sıralanmış bir listesini içerir. NtContinue önce kullanıcı tarafından sağlanan yönerge işaretçisi için gölge yığını denetler ve yönerge işaretçisi orada bulunmazsa, yönerge işaretçisini içeren ikili dosyadan EH Devamlılık Tablosu'nu denetlemeye devam eder. İçeren ikili tabloyla derlenmezse, eski ikili NtContinue dosyalarla uyumluluk için devam etme izni verilir. EHCONT verileri olmayan eski ikili dosyalar ile EHCONT verileri içeren ancak tablo girdisi içermeyen ikili dosyalar arasında ayrım yapmak önemlidir. önceki, ikili dosya içindeki tüm adreslere geçerli devamlılık hedefleri olarak izin verir. İkincisi, geçerli bir devamlılık hedefi olarak ikili dosya içinde herhangi bir adrese izin vermez.

bir /guard:ehcont ikili dosya için EH devamlılık hedef RVA'ları oluşturmak için seçeneğin hem derleyiciye hem de bağlayıcıya geçirilmesi gerekir. İkili dosyanız tek cl bir komut kullanılarak oluşturulduysa, derleyici bağlayıcıya seçeneğini geçirir. Derleyici, bağlayıcıya /guard:cf seçeneğini de geçirir. Ayrı olarak derleyip bağlarsanız, bu seçeneklerin hem derleyici hem de bağlayıcı komutlarında ayarlanması gerekir.

kullanarak /guard:ehcont derlenen kodu, kullanmadan derlenen kitaplıklara ve nesne dosyalarına bağlayabilirsiniz. Bağlayıcı, şu senaryolardan herhangi birinde önemli bir hata döndürür:

  • Kod bölümünde "yerel geri sarma" vardır. Daha fazla bilgi için try-finally Deyiminde anormal sonlandırma bölümüne bakın.

  • EH (xdata) bölümü, bir kod bölümünün işaretçilerini içerir ve bunlar SEH için değildir.

  • İşaretçiler SEH içindir, ancak nesne dosyası COMDAT'lar oluşturmak için işlev düzeyi bağlama (/Gy) kullanılarak derlenmiş değildir.

Bağlayıcı, bu senaryolarda meta veri oluşturamadığından önemli bir hata döndürür. Bu, özel durum oluşturmanın çalışma zamanında kilitlenmeye neden olabileceği anlamına gelir.

COMDAT'larda bulunan ancak kullanılarak /guard:ehcontderlenmeyen SEH bölüm bilgileri için bağlayıcı LNK4291 uyarı yayar. Bu durumda, bağlayıcı bölüm için doğru ama muhafazakar meta veriler oluşturur. Bu uyarıyı yoksaymak için /IGNORE (Belirli Uyarıları Yoksay) kullanın.

Bağlayıcı meta veri oluşturamıyorsa aşağıdaki hatalardan birini gösterir:

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

bir ikilinin EHCONT verileri içerip içermediğini denetlemek için, ikilinin yük yapılandırması dökümünü alırken aşağıdaki öğeleri arayın:

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

Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak için

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Kod Oluşturma özellik sayfasını seçin.

  3. EH Devamlılık Meta Verilerini Etkinleştir özelliğini seçin.

  4. Açılan denetimde, EH devamlılık meta verilerini etkinleştirmek için Evet (/guard:ehcont) öğesini veya devre dışı bırakmak için Hayır (/guard:ehcont-) seçeneğini belirleyin.

Ayrıca bkz.

/guard (Denetim Akışı Korumasını Etkinleştirme)
MSVC Derleyicisi Seçenekleri
MSVC Derleyicisi Komut Satırı Söz Dizimi