BlackNullSec Projeler #1: Mini Pe loader Nedir?
🚀 Amaç: Bu kod aslında senin “Mini Windows Loader / PE Parser” yolunun ilk gerçek adımı.
- Bir .exe dosyasını açıyorsun
- RAM’e yüklüyorsun
- Byte byte okuyorsun
- Sonra o byte dizisini Windows’un PE struct’ları gibi yorumluyorsun
Pe Parsing Projesi.
1.Senin kodunun yaptığı şey aslında şu:

Yani:

AŞAMA 1 — EXE Açma

Windows’ta dosya bir HANDLE ile temsil edilir.
HANDLE:
"Windows'un sana verdiği obje referansı"Yani:
Dosyanın kendisi değil.Dosyaya erişim bileti.
CreateFileA

Burada diyorsun ki:
"C:\Windows\System32\notepad.exe dosyasını aç. Ben sadece okuyacağım."
Parametreler
1.
Açılacak dosya.
2.

Yetki:
Sadece okuma.
4.
Dosya varsa aç.
AŞAMA 2 — Dosya Boyutu

Burada:
"EXE kaç byte?" ogreniyorsun
Örnegin:
245760 byte
AŞAMA 3 — RAM Ayırma

Burada diyorsun ki:
"Dosyanın tamamını RAM'e koyacak alan ver."
unsigned char* neden kullanıldı?
"EXE = saf byte dizisi"
unsigned char
tam olarak:1 byte
1 byte
1 byte
1 byte
garantili.
AŞAMA 4 — Dosyayı RAM’e Okuma

Şu oluyor:
Diskteki EXE
↓
RAM'deki buffer'a kopyalanıyor
Artık:
buffer[0]
buffer[1]
buffer[2]
gerçek EXE byte’larıdır.
AŞAMA 5 — İlk Byte’ları Okuma
PE dosyaları:
MZ ile başlar
ASCII’de:
M = 0x4D
Z = 0x5A
KRİTİK NOKTA
Burada:"buffer[0]" şunu verir: "0x4D " çünkü "unsigned char = 1 byte" ile byte byte okuyorsun.
AŞAMA 6 — Struct Casting
İşte PE parsing’in kalbi.
Burada Ne Oldu?
buffer aslında:unsigned char*tipinde.
Yani:
"Sadece byte dizisi"
Ama Windows diyor ki:
PE dosyasının başlangıcında "IMAGE_DOS_HEADER" vardır.
Ben de diyorum ki:
"Tamam.O zaman bu memory'i DOS HEADER gibi yorumla."
Gerçekte Olan
Önce:
buffer
↓
4D 5A 90 00 03 00 ...
Sadece byte dizisiydi.
Sonra:
Artık compiler şunu düşünüyor:
Bu memory düzeni IMAGE_DOS_HEADER struct'ı.
IMAGE_DOS_HEADER
Struct içinde:

e_magic

şunu okur:
5A4D
NEDEN 5A4D?
Çünkü CPU little endian.
Memory:
4D 5A
4D 5A
"0x5A4D" olur
Yani:
Memory görünümü ≠ integer görünümü
Little Endian Mantığı
Address+0 → 4D
Address+1 → 5A
Ama integer okunurken:Low byte önce olduğu için:"5A4D" çıkar.
AŞAMA 7 — e_lfanew

Bu PE dünyasının kapısıdır.
e_lfanew Ne?
Şunu söyler:
"Gerçek PE Header burada başlıyor."
Gerçek PE:"PE\0\0"signature’ından başlar.
Windows Ne Yapıyor?
Şunu yapıyor:BaseAddress + e_lfanew
Benim kodum

Çok Kritik Pointer Arithmetic
Burada:"buffer"tipi:"unsigned char*"olduğu için:"+1 = 1" byte ilerler.
Bu yüzden:"buffer + e_lfanew" gerçek byte offset verir.
ÖNEMLİ FORMÜL
PE Header Address=BaseAddress+e_lfanew
AŞAMA 8 — NT Header

Burada: "PE\0\0" okuyorsun. Hex olarak: "00004550" çıkar.Çünkü: " 'P' = 0x50 'E' = 0x45"
AŞAMA 9 — ImageBase

Bu şunu söyler: "Bu EXE RAM'de hangi adrese yüklenmek istiyor?" Örneğin: " 0x140000000"
Kritik
Bu: " Disk adresi değil" Bu: "Virtual Address base"
AŞAMA 10 — EntryPoint RVA

Bu: "Kodun başladığı offset" demek. Ama: "GERÇEK adres değil."
RVA Mantığı
RVA: "Relative Virtual Address" yani: "ImageBase'e göre offset"
GERÇEK ENTRYPOINT
Şu şekilde hesaplanır:
"EntryPoint VA=ImageBase+EntryPoint RVA"
Yani
Örneğin:
"ImageBase = 0x140000000
"EntryPoint RVA = 0x00002000"
Gerçek adres:
"0x140002000"
AŞAMA 11 — Section Sayısı

EXE içindeki section sayısı.
Örneğin:
.text
.rdata
.data
.rsrc
gibi.
⚠️ Kritik Uyarı
Bu teknikler yalnızca eğitim amaçlıdır. Gerçek sistemlere uygulanması yasadışı olabilir. Asla gerçek ortamlarda test etme.
🌟 Sonraki Yazı: Process Apı
"Process API" dediğimizde, Windows’ta işlem (process) oluşturma, kontrol etme ve sonlandırma gibi işlemleri gerçekleştiren Windows API fonksiyonları kastedilir. CreateProcess ve OpenProcess konularına geçeceğiz.
← Önceki Sonraki →“Windows Belleğiyle Konuşan Kodlar”
hacker