Windows işletim sisteminin kalbinde yer alan ve çalıştırılabilir dosyaların, dinamik bağlantı kütüphanelerinin (DLL) ve diğer bazı sistem dosyalarının temelini oluşturan yapıya Taşınabilir Çalıştırılabilir (Portable Executable - PE) Formatı denir. Bu format, programların belleğe nasıl yükleneceğini, fonksiyonların nasıl içe ve dışa aktarılacağını, kaynakların nasıl depolanacağını ve programın yürütülmesi için gereken diğer kritik bilgileri tanımlayan karmaşık bir yapıdır. PE formatını anlamak, tersine mühendislik (reverse engineering), kötü amaçlı yazılım analizi (malware analysis) ve sistem programlama gibi alanlarda temel bir yetkinliktir.
Bir PE dosyasının genel yapısı, geçmişten günümüze Windows'un evrimini yansıtan katmanlı bir düzeni takip eder. Bu katmanlar, dosyanın okunabilirliğini ve işlevselliğini sağlayan bir dizi başlıktan (header) ve bölümden (section) oluşur. Genel olarak, bir PE dosyası şu ana bileşenlerden meydana gelir:
Şimdi bu bileşenleri daha ayrıntılı inceleyelim:
1. DOS Header (IMAGE_DOS_HEADER):
Her PE dosyasının başında yer alan bu yapı, eski MS-DOS sistemleriyle geriye dönük uyumluluğu sağlamak için tasarlanmıştır. En kritik alanı, bir
değeri olan
alanıdır ve bu değer her zaman
(ASCII'de 'MZ') olmalıdır. Bu imza, bir dosyanın geçerli bir DOS veya PE yürütülebilir dosyası olduğunu gösterir. Diğer önemli bir alan ise
'dir; bu, DOS başlığının başlangıcından NT Başlıklarının (NT Headers) başlangıcına kadar olan bayt cinsinden ofseti gösterir. Modern Windows sistemleri bu başlığı genellikle atlar ve doğrudan NT Başlıklarına geçer.
2. DOS Stub Programı:
ile
arasında yer alan bu küçük program genellikle "This program cannot be run in DOS mode." (Bu program DOS modunda çalıştırılamaz.) mesajını gösteren basit bir yürütülebilir koddur. Günümüzde pratik bir işlevi olmasa da, PE formatının tarihi kökenlerini temsil eder.
3. NT Headers (IMAGE_NT_HEADERS):
Bu, PE dosyasının kalbidir ve dosyanın Windows işletim sistemi tarafından nasıl yorumlanacağını belirleyen hayati bilgileri içerir. Üç ana bileşeni vardır:
Veri Dizinleri (Data Directories):
yapısının sonunda yer alan bu dizin, PE dosyasının içerdiği çeşitli tabloların (import, export, kaynak vb.) adreslerini ve boyutlarını tutan bir yapıdır. Her biri
yapısıdır ve sanal adres (RVA) ve boyut içerir. En sık karşılaşılan veri dizinleri şunlardır:
Bu dizinler hakkında daha fazla detay için Microsoft'un PE Format Dokümantasyonuna başvurulabilir.
4. Section Headers (Bölüm Başlıkları):
'dan hemen sonra gelen bu başlıklar dizisi, PE dosyasının her bir mantıksal bölümü hakkında bilgi sağlar. Her
yapısı, bölümün adı (örneğin, ".text", ".data"), sanal boyutu (
), sanal adresi (
), ham veri boyutu (
), ham verinin dosyadaki ofseti (
) ve bölümün özelliklerini (
– okunabilir mi, yazılabilir mi, yürütülebilir mi vb.) içerir. Bu başlıklar, işletim sisteminin her bir bölümü belleğe nasıl yükleyeceğini ve hangi izinlerle erişeceğini belirlemesine olanak tanır.
5. Sections (Bölümler):
PE dosyasının gerçek kodunu, verisini ve kaynaklarını barındıran asıl alanlardır. Bölüm başlıklarında tanımlanan özelliklere göre belleğe yüklenirler. Tipik bölümler şunlardır:
RVA (Relative Virtual Address) ve VA (Virtual Address) İlişkisi:
PE formatını anlamanın temel taşlarından biri de adresleme mantığıdır.
Malware Analizindeki Önemi:
Kötü amaçlı yazılımlar genellikle PE formatının yapısını manipüle ederek tespit edilmekten kaçınmaya çalışır. Örneğin, bir zararlı yazılım yeni bölümler ekleyebilir (section injection), Import Address Table (IAT)'ı ele geçirebilir (IAT hooking) veya PE başlıklarındaki bilgileri tahrif edebilir. Bu tür saldırıları tespit etmek ve analiz etmek için PE formatının her ayrıntısını bilmek kritik öneme sahiptir. Tersine mühendisler, yürütülebilir dosyanın nasıl çalıştığını anlamak için bu formatı adım adım inceler, potansiyel güvenlik açıklarını veya kötü niyetli davranışları ortaya çıkarır.
Sonuç:
PE formatı, Windows işletim sisteminin karmaşık mimarisinin temel bir parçasıdır. Geriye dönük uyumluluktan modern güvenlik özelliklerine kadar birçok kavramı bünyesinde barındırır. Bu formatın derinlemesine anlaşılması, sadece bir teknik bilgi birikimi değil, aynı zamanda yazılım güvenliği, sistem programlama ve kötü amaçlı yazılım analizinde ileri düzeyde yetkinlik kazanmanın anahtarıdır. Windows üzerinde çalışan herhangi bir programın "nasıl" çalıştığını merak eden herkes için PE formatının sırlarını çözmek, gerçek bir aydınlanma deneyimi sunacaktır.
Bir PE dosyasının genel yapısı, geçmişten günümüze Windows'un evrimini yansıtan katmanlı bir düzeni takip eder. Bu katmanlar, dosyanın okunabilirliğini ve işlevselliğini sağlayan bir dizi başlıktan (header) ve bölümden (section) oluşur. Genel olarak, bir PE dosyası şu ana bileşenlerden meydana gelir:
[li]DOS Header: Geriye dönük uyumluluk için ilk başlık.[/li]
[li]DOS Stub Programı: DOS ortamında çalıştırıldığında bir mesaj gösteren küçük bir program.[/li]
[li]NT Headers: PE dosyasının asıl yapısını ve özelliklerini tanımlayan ana başlık bloğu.[/li]
[li]Section Headers: Dosyanın kod, veri ve kaynak gibi farklı mantıksal bölümlerini tanımlar.[/li]
[li]Sections (Bölümler): Gerçek kodun, verinin ve kaynakların bulunduğu alanlar.[/li]
Şimdi bu bileşenleri daha ayrıntılı inceleyelim:
1. DOS Header (IMAGE_DOS_HEADER):
Her PE dosyasının başında yer alan bu yapı, eski MS-DOS sistemleriyle geriye dönük uyumluluğu sağlamak için tasarlanmıştır. En kritik alanı, bir
Kod:
WORD
Kod:
e_magic
Kod:
0x5A4D
Kod:
e_lfanew
2. DOS Stub Programı:
Kod:
IMAGE_DOS_HEADER
Kod:
NT Headers
3. NT Headers (IMAGE_NT_HEADERS):
Bu, PE dosyasının kalbidir ve dosyanın Windows işletim sistemi tarafından nasıl yorumlanacağını belirleyen hayati bilgileri içerir. Üç ana bileşeni vardır:
[li]Signature (İmza): Dört baytlıkKod:0x00004550
[li]File Header (IMAGE_FILE_HEADER): CPU mimarisi (Kod:Machine
Kod:NumberOfSections
Kod:TimeDateStamp
Kod:Characteristics
Kod:Characteristics
[li]Optional Header (IMAGE_OPTIONAL_HEADER): Adının aksine, bu başlık kesinlikle isteğe bağlı değildir ve PE dosyasının bellekte nasıl yükleneceği ve yürütüleceği hakkında kritik bilgiler içerir. Giriş noktası adresi (Kod:AddressOfEntryPoint
Kod:ImageBase
Kod:SectionAlignment
Kod:FileAlignment
Veri Dizinleri (Data Directories):
Kod:
IMAGE_OPTIONAL_HEADER
Kod:
IMAGE_DATA_DIRECTORY
[li]Export Table: Modülün dışa aktardığı fonksiyonların ve değişkenlerin listesi. Diğer programlar veya DLL'ler bu tablolar aracılığıyla fonksiyonları çağırabilir.[/li]
[li]Import Table: Modülün diğer DLL'lerden içe aktardığı fonksiyonların listesi. Bir programın dış fonksiyonları nasıl çağırdığını gösterir. Import Address Table (IAT) özellikle dinamik olarak yüklenen fonksiyonların adreslerinin çalışma zamanında çözümlenmesi için kritik öneme sahiptir.[/li]
[li]Resource Table: Programın kullandığı ikonlar, menüler, stringler, dialog kutuları gibi kaynakların bulunduğu yerdir.[/li]
[li]Exception Table: Özel durum işleyicileri (exception handlers) ile ilgili bilgileri içerir.[/li]
[li]Certificate Table: Dosya bütünlüğünü ve orijinalliğini doğrulamak için kullanılan dijital imzaları içerir.[/li]
[li]Base Relocation Table: Programın tercih edilenKod:ImageBase
[li]Debug Table: Hata ayıklama bilgileri.[/li]
[li]TLS (Thread Local Storage) Table: İş parçacığına özgü veri depolama için gerekli bilgileri içerir.[/li]
Bu dizinler hakkında daha fazla detay için Microsoft'un PE Format Dokümantasyonuna başvurulabilir.
4. Section Headers (Bölüm Başlıkları):
Kod:
NT Headers
Kod:
IMAGE_SECTION_HEADER
Kod:
VirtualSize
Kod:
VirtualAddress
Kod:
SizeOfRawData
Kod:
PointerToRawData
Kod:
Characteristics
5. Sections (Bölümler):
PE dosyasının gerçek kodunu, verisini ve kaynaklarını barındıran asıl alanlardır. Bölüm başlıklarında tanımlanan özelliklere göre belleğe yüklenirler. Tipik bölümler şunlardır:
[li].text veya .code: Programın yürütülebilir makine kodunu içerir.[/li]
[li].rdata: Salt okunur veri (read-only data) içerir. Sabitler, string değişmezleri, import/export tabloları gibi veriler buradadır.[/li]
[li].data: Başlatılan, okunabilir ve yazılabilir veriyi içerir (global değişkenler gibi).[/li]
[li].bss: Başlatılmamış veriyi içerir. Bu bölüm dosya üzerinde yer kaplamaz, bellekte ayrılır.[/li]
[li].rsrc: Programın kullandığı tüm kaynakları (ikonlar, imleçler, bitmapler, dialoglar, string tabloları) barındırır.[/li]
[li].idata: İçe aktarılan (imported) fonksiyonların adları ve DLL referansları gibi import verileri.[/li]
[li].edata: Dışa aktarılan (exported) fonksiyonların adları ve giriş noktaları gibi export verileri.[/li]
[li].reloc: Taban adresi sabitleme (base relocation) verileri.[/li]
RVA (Relative Virtual Address) ve VA (Virtual Address) İlişkisi:
PE formatını anlamanın temel taşlarından biri de adresleme mantığıdır.
Örneğin, bir fonksiyonun RVA'sı 0x1000 ise ve modül 0x400000 adresine yüklendiyse, fonksiyonun gerçek sanal adresi (VA) 0x401000 olacaktır. Bu göreceli adresleme, programın bellekte farklı adreslere yüklenebilmesine olanak tanır, bu da modern işletim sistemlerinin bellek yönetiminde esneklik sağlar ve güvenlik mekanizmalarına (ASLR - Address Space Layout Randomization) yardımcı olur.RVA, bir modülün bellekte yüklendiği başlangıç adresi () baz alınarak hesaplanan göreceli bir adrestir.Kod:ImageBase
Malware Analizindeki Önemi:
Kötü amaçlı yazılımlar genellikle PE formatının yapısını manipüle ederek tespit edilmekten kaçınmaya çalışır. Örneğin, bir zararlı yazılım yeni bölümler ekleyebilir (section injection), Import Address Table (IAT)'ı ele geçirebilir (IAT hooking) veya PE başlıklarındaki bilgileri tahrif edebilir. Bu tür saldırıları tespit etmek ve analiz etmek için PE formatının her ayrıntısını bilmek kritik öneme sahiptir. Tersine mühendisler, yürütülebilir dosyanın nasıl çalıştığını anlamak için bu formatı adım adım inceler, potansiyel güvenlik açıklarını veya kötü niyetli davranışları ortaya çıkarır.
Sonuç:
PE formatı, Windows işletim sisteminin karmaşık mimarisinin temel bir parçasıdır. Geriye dönük uyumluluktan modern güvenlik özelliklerine kadar birçok kavramı bünyesinde barındırır. Bu formatın derinlemesine anlaşılması, sadece bir teknik bilgi birikimi değil, aynı zamanda yazılım güvenliği, sistem programlama ve kötü amaçlı yazılım analizinde ileri düzeyde yetkinlik kazanmanın anahtarıdır. Windows üzerinde çalışan herhangi bir programın "nasıl" çalıştığını merak eden herkes için PE formatının sırlarını çözmek, gerçek bir aydınlanma deneyimi sunacaktır.