Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu bölümde bellek bütünlüğü uyumlu kodun nasıl uygulandığı açıklanmaktadır.
Uyarı
Bellek bütünlüğü bazen hiper yönetici korumalı kod bütünlüğü (HVCI) veya hiper yönetici tarafından zorunlu kod bütünlüğüolarak adlandırılır ve başlangıçta Device Guardkapsamında yayınlanmıştır. Device Guard artık Grup İlkesi'nde veya Windows kayıt defterinde bellek bütünlüğünü ve VBS ayarlarını bulmak dışında kullanılmaz.
Uyumlu kod uygulamak için sürücü kodunuzun aşağıdakileri yaptığınızdan emin olun:
- Varsayılan olarak NX'i etkinleştirir
- Bellek ayırma için NX API'lerini/bayraklarını kullanır (NonPagedPoolNx)
- Hem yazılabilir hem de yürütülebilir bölümleri kullanmaz
- Yürütülebilir sistem belleğini doğrudan değiştirmeye çalışmaz
- Çekirdekte dinamik kod kullanmaz
- Veri dosyalarını yürütülebilir olarak yüklemez
- Bölüm hizalaması, 0x1000 (PAGE_SIZE) katlarıdır. Örneğin DRIVER_ALIGNMENT=0x1000
Sistem kullanımı için ayrılmamış olan DDI'lerin aşağıdaki listesi etkilenebilir:
Bellek bütünlüğü sürücü uyumluluğunu test etmek için HLK'deki kod bütünlüğü testlerini kullanın
İlgili sistem temelleri güvenlik testi hakkında daha fazla bilgi için bkz. HyperVisor Kod Bütünlüğü Hazırlık Testi ve Bellek bütünlüğü ve VBS.
İlgili cihaz temel bilgileri testi hakkında daha fazla bilgi için bkz. Device.DevFund testleri.
Çıktıyı yorumlamak ve farklı bellek bütünlüğü uyumsuzluklarını düzeltmek için hangi sürücü kodu değişikliklerinin gerekli olduğunu belirlemek için aşağıdaki tabloyu kullanın.
| Uyarı | Kefaret |
Havuz Türünü Çalıştır |
Arayan, yürütülebilir bir havuz türü belirtti. Yürütülebilir bellek isteyen bir bellek ayırma işlevini çağırma. Tüm havuz türlerinin yürütülebilir olmayan bir NX bayrağı içerdiğine emin olun. |
Sayfa Korumasını Yürütme |
Arayan, yürütülebilir sayfa koruması belirledi. "Yürütme yok" sayfa koruma maskesi belirtin. |
Sayfa Eşlemesini Yürüt |
Çağırıcı, yürütülebilir bellek tanımlayıcı listesi (MDL) eşlemesi belirtti. Kullanılan maskenin MdlMappingNoExecute içerdiğinden emin olun. Daha fazla bilgi için bkz. MmGetSystemAddressForMdlSafe |
Execute-Write Bölümü |
Görüntü yürütülebilir ve yazılabilir bir bölüm içerir. |
Bölüm Hizalama Hataları |
Görüntüde sayfa hizalanmamış bir bölüm var. Bölüm Hizalama, 0x1000 (PAGE_SIZE) katı olmalıdır. Örneğin DRIVER_ALIGNMENT=0x1000 |
Yürütülebilir Bölümde IAT |
İçeri aktarma adresi tablosu (IAT), belleğin yürütülebilir bir bölümü olmamalıdır. IAT, belleğin yalnızca Okuma ve Yürütme (RX) bölümünde bulunduğunda bu sorun oluşur. Bu, işletim sisteminin başvuruda bulunulduğu DLL'nin doğru adreslerini ayarlamak için IAT'ye yazamayacağı anlamına gelir. Bunun oluşmasının bir yolu, kod bağlamada /MERGE (Bölümleri Birleştir) seçeneğini kullanmaktır. Örneğin.rdata (Salt okunur başlatılan veriler) .text verileriyle (Yürütülebilir kod) birleştirilirse, IAT belleğin yürütülebilir bir bölümünde bulunabilir. |
Desteklenmeyen Adres Yeniden Yerleştirmeleri
Windows 10, sürüm 1507 ile Windows 10, sürüm 1607 arasında, Adres Alanı Düzeni Rastgele Oluşturma (ASLR) kullanımı nedeniyle adres hizalama ve bellek yeniden konumlandırma ile ilgili bir sorun ortaya çıkabilir. İşletim sisteminin, bağlayıcının varsayılan temel adresini ASLR'nin atadığı gerçek konuma taşımak için adresi yeniden konumlandırması gerekir. Bu yeniden konumlandırma bir sayfa sınırını aşamaz. Örneğin, bir sayfadaki ofseti 0x3FFC'den başlayan 64-bit adres değerini düşünün. Adres değeri, 0x0003 offsetinde bir sonraki sayfaya taşma yapıyor. Windows 10, sürüm 1703'ün öncesinde bu tür örtüşen yeniden yerleştirmeler desteklenmez.
Bu durum, bir global yapı türü değişken başlatıcısı, başka bir global yapıya yanlış hizalanmış bir işaretçi içerdiğinde ve bağlayıcının, taşmalı konumlandırmayı önlemek için değişkeni taşıyamayacağı şekilde yerleştirildiğinde ortaya çıkabilir. Bağlayıcı değişkeni taşımaya çalışır, ancak bunu yapamayacak durumlar vardır (örneğin, büyük yanlış hizalanmış yapılar veya yanlış hizalanmış yapıların büyük dizileri). Uygun olduğunda, bağlayıcının modül kodunu mümkün olduğunca hizalamasına izin vermek için modüller /Gy (COMDAT) seçeneği kullanılarak derlenmelidir.
#include <pshpack1.h>
typedef struct _BAD_STRUCT {
USHORT Value;
CONST CHAR *String;
} BAD_STRUCT, * PBAD_STRUCT;
#include <poppack.h>
#define BAD_INITIALIZER0 { 0, "BAD_STRING" },
#define BAD_INITIALIZER1 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0 \
BAD_INITIALIZER0
#define BAD_INITIALIZER2 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1 \
BAD_INITIALIZER1
#define BAD_INITIALIZER3 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2 \
BAD_INITIALIZER2
#define BAD_INITIALIZER4 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3 \
BAD_INITIALIZER3
BAD_STRUCT MayHaveStraddleRelocations[4096] = { // as a global variable
BAD_INITIALIZER4
};
Bu sorunun da ortaya çıkabileceği, derleyici kodunun kullanımını içeren başka durumlar da vardır.
Sürücü Doğrulayıcı kod bütünlüğü
Bu özellikle uyumluluğu doğrulayan ek denetimleri etkinleştirmek için Sürücü Doğrulayıcı kod bütünlüğü seçenek bayrağını (0x02000000) kullanın. Bunu komut satırından etkinleştirmek için aşağıdaki komutu kullanın.
verifier.exe /flags 0x02000000 /driver <driver.sys>
Doğrulayıcı GUI'sini kullanıyorsanız bu seçeneği belirlemek için özel ayarlar oluştur seçin (kod geliştiricileri için), İleri 'i seçin ve ardından Kod bütünlüğü denetimleriseçeneğini belirleyin.
Geçerli sürücü doğrulayıcı bilgilerini görüntülemek için doğrulayıcı komut satırı /query seçeneğini kullanabilirsiniz.
verifier /query
Ayrıca Bkz.
sürücü güvenlik denetim listesi