Hem teknik okur için doyurucu, hem de genel teknoloji meraklısı için anlaşılır bir rehber: PE Header ne işe yarar, hangi bilgileri verir ve ASLR/DEP/CFG gibi güvenlik mekanizmalarıyla ilişkisi nedir?
Bir .exe’ye tıkladığında neler oluyor?
Bazen bir uygulamaya çift tıklarsın… anında açılır.
Bazen de bir saniye durur, sonra “çalışmayı durdurdu” deyip kapanır.
O an fark etmiyoruz ama Windows, o dosyaya bakıp arka planda bir sürü karar veriyor: “Bu dosya x64 mü, yoksa x86 mı?” “Nereden başlayacağım?” “Hangi DLL’lere ihtiyacım var?”
İşte bu kararların büyük kısmı dosyanın içindeki bir “kimlik kartından” geliyor: PE Header. Ben PE Header’ı şöyle seviyorum: kimlik kartı + içindekiler haritası + yükleme talimatları.
Hızlı Özet
- PE (Portable Executable), Windows’ta EXE/DLL dosyalarının standart formatıdır.
- PE Header, dosyanın mimarisini (x86/x64), giriş noktasını (Entry Point), alt sistemini (GUI/Console), bölümlerini (sections) ve kritik tablolarını (import/export/resource…) taşır.
- Güvenlikle ilişkisi vardır: ASLR/DEP/CFG gibi mekanizmalarla ilgili işaretler ve tablolar PE içinde görülür.
- PE Header tek başına “güvenli” demek değildir; ama analizde çok güçlü ipuçları verir.
PE Header nedir?
PE Header, Windows’un bir EXE/DLL dosyasını yükleyebilmesi için gereken başlık (header) ve tablolar bütünüdür. Windows Loader, bu bilgileri okuyarak dosyanın nasıl belleğe yerleştirileceğini ve nasıl çalıştırılacağını belirler.
Bir uygulamayı çalıştırmak, sadece “dosyayı açıp bytes okumak” değildir. Kod, veri ve kaynakların doğru yerlere map edilmesi, doğru izinlerin verilmesi ve bağımlılıkların yüklenmesi gerekir. PE Header bu sürecin rehberidir.
Neden var?
Çünkü bir EXE dosyası; makine kodu, veriler, ikonlar, stringler, import tabloları ve daha birçok parçadan oluşur. Windows’un bunları doğru sırayla ve doğru izinlerle belleğe yerleştirmesi gerekir.
PE Header olmasa Windows’un elinde “şu bölüm kod, şu bölüm veri; buradan başla; şunları import et” diyebileceği bir harita olmazdı.
PE dosyasının üstten görünümü (MZ → PE)
PE dosyalarının çoğu en başta “MZ” (DOS Header) ile başlar. Bu, tarihsel bir uyumluluk katmanı.
Ardından PE imzasına giden bir işaretçi (genellikle e_lfanew) bulunur.
PE Signature: “Ben PE’yim”
PE imzası çoğunlukla PE\0\0 şeklindedir. Bu imza, dosyanın PE formatında olduğunu doğrulayan “sihirli” işarettir.
PE Header bize hangi bilgileri verir?
1) COFF File Header: Dosyanın “kimliği”
Bu bölüm; mimari (x86/x64), bölüm sayısı ve bazı tanımlayıcı alanlar gibi “hızlı özet” bilgiler içerir. Buradaki bazı alanlar değiştirilebilir; bu yüzden tek başına kanıt değil, ipucu olarak okunmalıdır.
2) Optional Header: Adı “optional”, etkisi “zorunlu”
Burada işin “yükleme talimatı” tarafı başlar. En kritik alanlardan bazıları şunlardır:
- AddressOfEntryPoint: Programın başlayacağı adres.
- ImageBase: Tercih edilen yükleme adresi.
- Subsystem: Uygulama GUI mi Console mu?
- DllCharacteristics: ASLR/DEP/CFG gibi güvenlik ve davranış işaretleri.
3) Data Directories: “Önemli tablolarım şurada”
PE formatında “Data Directories”, kritik tabloların nerede olduğunu işaret eder. Öne çıkanlar:
- Import Directory: Hangi DLL’lerden hangi fonksiyonlar kullanılıyor?
- Export Directory: (DLL’lerde) dışarı hangi fonksiyonlar sunuluyor?
- Resource Directory: İkonlar, version info, dialog ve diğer kaynaklar.
- Base Relocation Table: İmaj farklı adrese yüklenirse düzeltilecek adresler.
- Debug Directory: Debug izleri ve ilgili işaretler.
- Security / Certificate Table: Dijital imza (Authenticode) işaretleri.
- Load Config Directory: CFG gibi mekanizmalarla ilişkili metadata/tablolar.
4) Section Table & Sections: Kod ve verinin “haritası”
Section Table; her bölümün (ör. .text, .rdata, .data, .rsrc) dosyada ve bellekte nerede durduğunu,
boyutlarını ve izinlerini (okuma/yazma/çalıştırma) belirtir.
Pratikte bölüm izinleri güvenlik açısından da önemlidir. Örneğin bir bölümün hem yazılabilir hem de çalıştırılabilir olması (RWX) genellikle “riskli” bir sinyal olarak görülür.
Güvenlik: ASLR, DEP, CFG PE Header ile ilgili mi?
Kısa cevap: Evet, ilgili. Ama doğru çerçeve şu: PE Header tek başına güvenlik kalkanı değildir; fakat Windows’un bazı korumaları nasıl uygulayacağını etkileyen işaretler taşır.
ASLR (Address Space Layout Randomization)
ASLR, imajın bellekte her seferinde farklı adrese yüklenebilmesini hedefler. Bunun için PE tarafında genelde DYNAMIC_BASE gibi işaretler ve relocation verileri önemlidir. Relocation verisi yoksa, imajın taşınabilirliği azalır.
DEP / NX (Data Execution Prevention)
DEP/NX tarafında NX_COMPAT işareti “DEP ile uyumluyum” sinyali olarak görülebilir. Ayrıca bölüm izinleri (özellikle kodun RX olması) pratikte önemli bir göstergedir.
CFG (Control Flow Guard)
CFG etkinleştirilmiş uygulamalarda, bunun izleri PE’de (özellikle Load Config tarafında) görülebilir. CFG, dolaylı çağrı/sıçrama akışını daha kontrollü hale getirerek bazı exploit türlerini zorlaştırır.
SSS (Sık Sorulan Sorular)
1) PE Header sadece Windows’ta mı var?
Evet. PE formatı Windows ailesinin EXE/DLL standardıdır. Diğer platformlarda ELF (Linux) veya Mach-O (macOS) gibi formatlar bulunur.
2) “Optional Header” gerçekten opsiyonel mi?
Adı kafa karıştırır. EXE/DLL gibi image dosyalarında kritik alanları taşır; pratikte “opsiyonel” değilmiş gibi davranır.
3) PE’den ASLR/DEP/CFG hakkında fikir yürütmek mümkün mü?
Evet. DllCharacteristics içindeki işaretler ve ilgili tablolar (reloc/load config gibi) güçlü ipuçları verir. Yine de tek başına “kesin hüküm” değil, analiz başlangıcıdır.
4) PE Header “güvenli dosya” garantisi verir mi?
Hayır. PE Header değiştirilebilir. Ancak bölümler, importlar, izinler, giriş noktası ve tablolar; şüpheli davranışları yakalamada çok değerlidir.
5) Hangi araçlarla PE Header’a bakabilirim?
PE-bear, CFF Explorer, PEview gibi araçlar görsel inceleme sağlar. Komut satırında ise dumpbin /headers benzeri araçlar iş görür.
Kaynaklar / İleri Okuma
- Microsoft Learn — PE Format (PE/COFF) dokümantasyonu
- Microsoft Learn — IMAGE_OPTIONAL_HEADER32 (winnt.h) (EntryPoint, ImageBase, Subsystem, DllCharacteristics vb.) + DllCharacteristics bayrakları (DynamicBase/NxCompatible/…)
- MSVC Linker seçenekleri: /DYNAMICBASE (ASLR) · /GUARD:CF (Linker — CFG desteği) · /guard:cf (Compiler — CFG)
- Authenticode / Certificate Table (imza) ve doğrulama akışı: Understanding PE signatures · Authenticode Digital Signatures · WinVerifyTrust (imza doğrulama)