/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 NtContinue
SetThreadContext
ç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ı, , RtlRestoreContext
ve SetThreadContext
gibi NtContinue
bir 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:ehcont
derlenmeyen 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
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Kod Oluşturma özellik sayfasını seçin.
EH Devamlılık Meta Verilerini Etkinleştir özelliğini seçin.
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