Image

Pe Parsing

Malware

BlackNullSec Path #2: Pe parsing

  • Dos Header (IMAGE_DOS_HEADER
  • DOS STUB
  • PE signature ("PE\0\0")
  • NT Headers -->File Header --> Optional Header (IMAGE_NT_HEADERS)S
  • SECTION 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ırmaz
  • Ama atlanacak yeri buradan öğrenir
  • Yani: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ğrular
  • Yanlışsa loader dosyayı reddeder
  • Malware’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 kalma
  • Tarihsel uyumluluk için hâlâ var
  • Modern Windows bununla çalışmaz
  • Sadece 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 eder
  • Yanlışsa → program asla çalışmaz
  • SizeOfImage
  • Subsystem
  • 📌 Loader’ın gerçek karar noktası.
  • 👉 PE\0\0 = ana kapı


ÖNEMLİ: 📌NOT=MZ imzası, dosyanın çalıştırılabilir bir formatta olduğunu gösterirken, PE\0\0 imzası, dosyanın gerçekten Windows Portable Executable olduğunu doğrular."Bir kimlik kartıdır "

📌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 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.
  • ÖNEMLİ: 🔍 Malware ipucu:Yanlış Machine değeri → packed / bozuk PE


📌NumberOfSections – Yapının Haritası

“Bu PE kaç parça halinde yükleniyor?”

Örnek
  • .text
  • .rdata
  • .data
  • .rsrc
  • 📌Loader:

  • Bu sayı kadar section header okur
  • Eksik / fazla ise → şüphe
  • 🦠 Malware bazen:

  • Sahte section ekler
  • Sayıyı yanıltır

📌TimeDateStamp – Zaman Damgası


    Normalde:
  • Derleme zamanı

  • Ama pratikte:
  • ❌ Güvenilmez
  • ❌ Kolayca sahte

  • 📌 Malware’ler:
  • 0
  • Sabit tarih
  • Rastgele değer
  • 📌Tek başına delil değildir, bağlamla okunur.

📌SizeOfOptionalHeader – Kapının Genişliği

    Bu alan:
  • Optional Header’ın boyutunu söyler.
  • Ama pratikte:
  • 32-bit → farklı
  • 64-bit → farklı
  • 📌 Loader buradan:
  • Sonraki alanların nerede başladığını hesaplar
  • Yanlışsa:
  • Parse bozulur
  • Analiz kırılır

📌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           |
    📌 Buradan:
  • EXE mi DLL mi
  • Nasıl yüklenecek anlaşılır.
  • 🦠 Malware bazen:
  • EXE gibi davranan DLL yazar
  • Flag’leri karıştırır

IMAGE_OPTIONAL_HEADER NEDİR?

Windows loader’ın asıl karar verdiği yer burası.

Şunu düşün:

  • DOS Header → yol gösterir
  • File Header → kimlik verir
  • Optional 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?”
  • ❗Bu alan Machine alanıyla uyumlu olmalı.
  • Uyumsuzluk → packed / bozuk PE sinyali.

📌AddressOfEntryPoint – Program Nereden Başlar?

“İlk çalışacak kod nerede?”

Bu alan: 📌 EntryPoint = ImageBase + AddressOfEntryPoint
📌 Loader :
  • Section’ları map eder
  • Import’ları çözer
  • buraya zıplar
  • 🦠 Malware’ler:
  • EntryPoint’i gizler
  • Junk code’a yönlendirir
  • Sonradan gerçek koda geçer

📌ImageBase – Bellekteki Ev Adresi

““Bu PE bellekte toplam ne kadar yer ister?””

  • Tüm section’ların toplamı
  • Alignment dahil
  • 🦠 Manual mapping yapan malware:
  • Bu alanı yanlış hesaplayabilir
  • Kendi loader’ını kullanır

📌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 Table
  • Export Table
  • Relocation
  • TLS
  • Resource
ÖNEMLİ: 📌 Dynamic API Resolve, TLS callback, injection teknikleri buradan başlar.

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 burada
  • EntryPoint genelde burada
  • Executable flag vardır
  • 👉 Reverse engineering’in ana sahnesi burası.
📌.data
  • Global değişkenler
  • Yazılabilir veri
📌.rdata
  • Sabit veriler
  • Import Table
  • String’ler

📌.rsrc
  • Icon
  • Version info
  • GUI 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:
ÖNEMLİ: RVA ↔ RAW dönüşümü yapmayı bilmeyen biri ilerleyemez.

🧠 Characteristics (Çok Önemli)

| Flag    | Anlam                |
| ------- | -------------------- |
| EXECUTE | Kod çalıştırılabilir |
| READ    | Okunabilir           |
| WRITE   | Yazılabilir          |

📌 Eğer: Section hem WRITE hem EXECUTE ise → Shellcode barındırma ihtimali


🦠 Malware Section Oyunları

Malware geliştiriciler:
  • Sahte section ekler
  • .text yerine başka isim kullanır
  • W+X flag açar
  • Section sayısını abartır
  • EntryPoint’i anormal yere koyar

📂 DATA DIRECTORIES

🧠 Data Directory Nedir?
IMAGE_OPTIONAL_HEADER içinde şu alan vardı:
Bu alan: IMAGE_DATA_DIRECTORY DataDirectory[16];

Bu şunu demek:

Bu alan: PE dosyasının içinde 16 tane özel tabloya giden adres var.

Yani:

PE → Optional Header → DataDirectory → Alt yapılar

Import Table (En Kritik)

📌 Program hangi DLL ve API’leri kullanıyor?
  • kernel32.dll
  • CreateFileA
  • VirtualAlloc
  • WriteProcessMemory
  • Eğer şunları görürsen:

  • CreateRemoteThread
  • VirtualAllocEx
  • WinExec
Önemli: → Injection ihtimali vardır .

Export Table

📌 DLL hangi fonksiyonları dışarı sunuyo
  • DLL’ler için
  • Reflective loader’larda
  • Custom export’lu malware’de

Relocation Table

📌 ImageBase değişirse ne olacak?

    ASLR devredeyse:

  • Program başka adrese yüklenir
  • Relocation table adresleri düzeltir
  • önemlidir.

Önemli: → Manual mapping burada başlar.

TLS Callback

📌 EntryPoint’ten önce kod çalıştırma.

    Bu çok kritik.

  • Anti-debug
  • Anti-VM
  • Environment check
  • işlerini burada yapabilir.

Resource Table

📌 İkon, versiyon, embedded data

    Bazı malware:

  • Payload’u resource içine gömer.

Exception Table

📌 Structured Exception Handling.

    Genelde:

  • C++ programlarda
  • Kernel modüllerde
  • 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.

BlackNullSec
“Windows Belleğiyle Konuşan Kodlar”