BlackNullSec Path #2: Pe parsing
Dos Header (IMAGE_DOS_HEADERDOS STUBPE signature ("PE\0\0")NT Headers -->File Header --> Optional Header (IMAGE_NT_HEADERS)SSECTION HEADERS (IMAGE_SECTION_HEADER)(.text,.data,.rdata
1. IMAGE_DOS_HEADER
Bir Windows executable dosyası (.exe, .dll) her zaman bir IMAGE_DOS_HEADER ile başlar.
MS-DOS döneminden kalma bir uyumluluk katmanıModern Windows bu header’ı çalıştırmazAma atlanacak yeri buradan öğrenirYani:DOS Header = yön levhası
typedef struct _IMAGE_DOS_HEADER{ WORD e_magic; // mz LONG e_lfanew; //PE header'a offset }IMAGE_DOS_HEADER NOT=e_lfanew olanı Pe dosyasınım NT Headers başlangç noktasıdır. Yani "Asıl PE header şuradan başlıyor" diyen adres işaretcisi
2. IMAGE_NT_HEADERS
IMAGE_NT_HEADERS, PE dosyasının asıl merkezidir.Windows loader gerçek kararları burada verir .
📌Burada şunu düşün:
1.)DOS Header = “oraya git”2.)NT Headers = “nasıl çalışacağım”
typedef struct _IMAGE_NT_HEADERS{ DWORD Signature // "PE\0\0" IMAGE_FILE_HEADER FileHeader; // Dosya bilgileri IMAGE_OPTIONAL_HEADER OptionalHeader; // Bellek & loader ayarları }IMAGE_NT_HEADERS
Signature NEDİR?
Signature = 0x00004550 // "PE\0\0"
Bu imza :
Dosyanın gerçekten PE olduğunu doğrularYanlışsa loader dosyayı reddederMalware’ler bazen bunu runtime’da üretir
“MZ” ile “PE\0\0” farkı NEDİR?
Bunlar iki farklı kapı, iki farklı kontrol.
MZ (DOS Header imzası)
4D 5A → "MZ"
Anlamı şudur:
📌“Bu dosya bir executable formatına benziyor.”
MS-DOS zamanından kalmaTarihsel uyumluluk için hâlâ varModern Windows bununla çalışmazSadece dosyanın başı geçerli mi diye bakılır
👉 MZ = dış kapı
PE\0\0 (NT Header imzası)
50 45 00 00 → "PE\0\0"
Asıl anlamı şudur:
“Bu dosya gerçekten Windows Portable Executable.”
Windows loader buraya güvenerek devam ederYanlışsa → program asla çalışmazSizeOfImageSubsystem📌 Loader’ın gerçek karar noktası.
👉 PE\0\0 = ana kapı
📌File Header NEYİ ANLATIR?
PE dosyasının ne tür bir dosya oldugunu soyler
Windows loader burada şuna karar verir:
Bu dosya EXE mi DLL mi?
32-bit mi 64-bit mi?
Kaç section var?
Nasıl davranmalıyım?
📌 Yani: Dosyanın kimliği
📌IMAGE_FILE_HEADER
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER;
Machine – Mimari (x86 / x64)
NumberOfSections – Section sayısı
TimeDateStamp – Derleme zamanı
SizeOfOptionalHeader – Optional Header boyutu
Characteristics – EXE / DLL bilgisi
📌Machine – Mimari Kararı
Bu dosya EXE mi DLL mi?32-bit mi 64-bit mi?Kaç section var?Nasıl davranmalıyım?📌 Yani: Dosyanın kimliği
📌IMAGE_FILE_HEADER
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER;
Machine– Mimari (x86 / x64)NumberOfSections– Section sayısıTimeDateStamp– Derleme zamanıSizeOfOptionalHeader– Optional Header boyutuCharacteristics– EXE / DLL bilgisi
📌Machine – Mimari Kararı
Bu alan en kritik alanlardan biri.
| Değer | Anlam | | -------- | ------------ | | `0x014c` | x86 (32-bit) | | `0x8664` | x64 (64-bit) |
📌 Loader buraya bakarak:
Hangi loader yolunu kullanacağınıWOW64 gerekip gerekmediğinibelirler.
📌NumberOfSections – Yapının Haritası
“Bu PE kaç parça halinde yükleniyor?”
Örnek
.text.rdata.data.rsrcBu sayı kadar section header okurEksik / fazla ise → şüpheSahte section eklerSayıyı yanıltır
📌Loader:
🦠 Malware bazen:
📌TimeDateStamp – Zaman Damgası
Derleme zamanı❌ Güvenilmez❌ Kolayca sahte0Sabit tarihRastgele değer📌Tek başına delil değildir, bağlamla okunur.
Normalde:
Ama pratikte:
📌 Malware’ler:
📌SizeOfOptionalHeader – Kapının Genişliği
Optional Header’ın boyutunu söyler.32-bit → farklı64-bit → farklıSonraki alanların nerede başladığını hesaplarParse bozulurAnaliz kırılır
Bu alan:
Ama pratikte:
📌 Loader buradan:
Yanlışsa:
📌Characteristics – Dosyanın Rolü
Burada en net sinyaller vardır.
| Flag | Anlam | | ----------------------------- | ---------------- | | `IMAGE_FILE_EXECUTABLE_IMAGE` | Çalıştırılabilir | | `IMAGE_FILE_DLL` | DLL | | `IMAGE_FILE_32BIT_MACHINE` | 32-bit |
EXE mi DLL miNasıl yüklenecek anlaşılır.EXE gibi davranan DLL yazarFlag’leri karıştırır
📌 Buradan:
🦠 Malware bazen:
IMAGE_OPTIONAL_HEADER NEDİR?
Windows loader’ın asıl karar verdiği yer burası.
Şunu düşün:
DOS Header → yol gösterirFile Header → kimlik verirOptional Header → nasıl çalışacağını söyler📌 Yani: çalıştırma talimat emri .
📌IMAGE_FILE_HEADER
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic;
DWORD AddressOfEntryPoint;
ULONGLONG ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
DWORD SizeOfImage;
WORD Subsystem;
IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER;
📌Magic – 32 bit mi 64 bit mi?
Bu alan:
0x10B → PE32 (32-bit) 0x20B → PE32+ (64-bit)
📌 Loader şunu sorar:
“Bu dosya hangi mimari?”Uyumsuzluk → packed / bozuk PE sinyali.
❗Bu alan Machine alanıyla uyumlu olmalı.
📌AddressOfEntryPoint – Program Nereden Başlar?
“İlk çalışacak kod nerede?”
📌 Loader :
Section’ları map ederImport’ları çözerburaya zıplarEntryPoint’i gizlerJunk code’a yönlendirirSonradan gerçek koda geçer
🦠 Malware’ler:
📌ImageBase – Bellekteki Ev Adresi
““Bu PE bellekte toplam ne kadar yer ister?””
Tüm section’ların toplamıAlignment dahilBu alanı yanlış hesaplayabilirKendi loader’ını kullanır
🦠 Manual mapping yapan malware:
📌Subsystem – Nerede Çalışacak?
| Değer | Anlam | | ------------- | --------------- | | `WINDOWS_GUI` | GUI uygulama | | `WINDOWS_CUI` | Console | | `NATIVE` | Kernel / driver |
📌 EXE ama GUI yoksa → şüphe
📌 Console beklenirken GUI ise → analiz ipucu
📌DataDirectory – Alt Haritalar
Bu alan:
Import TableExport TableRelocationTLSResource
SECTION HEADERS NEDİR?
PE dosyası tek parça değildir.Mantıksal bloklara ayrılır. Section = “Bellekte ayrı ayrı yüklenen kod/veri blokları”
(.text, .data, .rdata, .rsrc…)
Her section’ı Alignment’a göre Belleğe map eder.
📦 En Yaygın Section’lar
📌.text
Asıl çalışan kod buradaEntryPoint genelde buradaExecutable flag vardır👉 Reverse engineering’in ana sahnesi burası.
📌.data
Global değişkenlerYazılabilir veri
📌.rdata
Sabit verilerImport TableString’ler
📌.rsrc
IconVersion infoGUI kaynakları
🧱 IMAGE_SECTION_HEADER Yapısı
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[8];
DWORD VirtualSize;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD Characteristics;
} IMAGE_SECTION_HEADER;
🔥VirtualAddress (RVA)
Bu:Section’ın bellekteki başlangıç noktası⚠️ Bu gerçek adres değil.Bu bir RVA (Relative Virtual adress).
Gerçek adres:
Gerçek Adres = ImageBase + VirtualAddress
🔥PointerToRawData (Disk Offset)
Bu:Section’ın dosya içindeki başlangıç noktası
Yani:
Diskte nerede?Bellekte nerede?farklı olabilir.
🧠 RVA vs RAW (ÇOK KRİTİK)
| Disk | Bellek | | ---------------- | -------------- | | PointerToRawData | VirtualAddress | | SizeOfRawData | VirtualSize |
Malware analizi yaparken:
🧠 Characteristics (Çok Önemli)
| Flag | Anlam | | ------- | -------------------- | | EXECUTE | Kod çalıştırılabilir | | READ | Okunabilir | | WRITE | Yazılabilir |
🦠 Malware Section Oyunları
Malware geliştiriciler:
Sahte section ekler.text yerine başka isim kullanırW+X flag açarSection sayısını abartırEntryPoint’i anormal yere koyar
📂 DATA DIRECTORIES
🧠 Data Directory Nedir?
IMAGE_OPTIONAL_HEADER içinde şu alan vardı:
Bu şunu demek:
Yani:
PE → Optional Header → DataDirectory → Alt yapılarImport Table (En Kritik)
📌 Program hangi DLL ve API’leri kullanıyor?
kernel32.dllCreateFileAVirtualAllocWriteProcessMemoryCreateRemoteThreadVirtualAllocExWinExec
Eğer şunları görürsen:
Export Table
📌 DLL hangi fonksiyonları dışarı sunuyo
DLL’ler içinReflective loader’lardaCustom export’lu malware’de
Relocation Table
📌 ImageBase değişirse ne olacak?
Program başka adrese yüklenirRelocation table adresleri düzeltir
ASLR devredeyse:
önemlidir.
TLS Callback
📌 EntryPoint’ten önce kod çalıştırma.
Anti-debugAnti-VMEnvironment check
Bu çok kritik.
işlerini burada yapabilir.
Resource Table
📌 İkon, versiyon, embedded data
Payload’u resource içine gömer.
Bazı malware:
Exception Table
📌 Structured Exception Handling.
C++ programlardaKernel modüllerde
Genelde:
daha anlamlıdır.
🎯 Net Tablo
| Table | Analist için anlamı | | ---------- | ------------------- | | Import | Davranış tahmini | | Export | DLL analizi | | Relocation | ASLR / manual map | | TLS | Gizli başlangıç | | Resource | Saklı veri | | Exception | Hata kontrol |
⚠️ Kritik Uyarı
Bu teknikler yalnızca eğitim amaçlıdır. Gerçek sistemlere uygulanması yasadışı olabilir. Asla gerçek ortamlarda test etme.
“Windows Belleğiyle Konuşan Kodlar”
hacker