Image

Malware giriş.

Malware

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.


Image placeholder Image placeholder Image placeholder

1.Senin kodunun yaptığı şey aslında şu:

Image placeholder

Yani:

Image placeholder

AŞAMA 1 — EXE Açma

Image placeholder

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

Image placeholder


Burada diyorsun ki:

"C:\Windows\System32\notepad.exe dosyasını aç. Ben sadece okuyacağım."

Parametreler

1.

Image placeholder

Açılacak dosya.

2.

Image placeholder

Yetki:

Sadece okuma.

4.

Image placeholder

Dosya varsa aç.

AŞAMA 2 — Dosya Boyutu

Image placeholder

Burada:

"EXE kaç byte?" ogreniyorsun

Örnegin:

245760 byte

AŞAMA 3 — RAM Ayırma

Image placeholder

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

Image placeholder

Ş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

Image placeholder

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.

Image placeholder

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:

Image placeholder

Artık compiler şunu düşünüyor:

Bu memory düzeni IMAGE_DOS_HEADER struct'ı.

IMAGE_DOS_HEADER

Struct içinde:

Image placeholder

e_magic

Image placeholder

ş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

Image placeholder

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

Image placeholder

Ç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

Image placeholder

Burada: "PE\0\0" okuyorsun. Hex olarak: "00004550" çıkar.Çünkü: " 'P' = 0x50 'E' = 0x45"

AŞAMA 9 — ImageBase

Image placeholder

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

Image placeholder

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ı

Image placeholder

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 →
BlackNullSec
“Windows Belleğiyle Konuşan Kodlar”