Yazı

Windows Internals

Windows API katmanları, process/thread yapısı, PEB/TEB, registry, servisler, WMI ve COM gibi Windows iç yapılarının tersine mühendislik açısından özeti.

Windows Internals

Windows işletim sisteminin iç yapısını anlamak, tersine mühendislikte zararlı yazılımın neden belirli API’leri çağırdığını ve sistemle nasıl etkileşime geçtiğini derinlemesine kavramayı sağlar.


1. Windows API Katmanları

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Uygulama (.exe)
│
├─► Win32 API (kernel32.dll, user32.dll, advapi32.dll)
│   Yüksek seviyeli, belgelenmiş API'ler
│   CreateFile, ReadFile, RegSetValue, CreateProcess...
│
├─► Native API (ntdll.dll)
│   Düşük seviyeli, kısmen belgelenmiş
│   NtCreateFile, NtReadFile, NtSetValueKey...
│   Win32 API fonksiyonları bunları çağırır
│
├─► Syscall (SYSENTER / SYSCALL komutu)
│   User mode → Kernel mode geçişi
│   Syscall numarası → EAX/RAX
│
└─► Kernel (ntoskrnl.exe)
    Ring 0'da çalışır
    Gerçek işlemi yapan fonksiyonlar

API Katmanı Geçiş Örneği

1
2
3
4
5
6
CreateFileA (kernel32.dll)
  → CreateFileW (kernel32.dll, ANSI → Unicode dönüşüm)
    → NtCreateFile (ntdll.dll)
      → MOV EAX, syscall_number
      → SYSCALL
        → ntoskrnl!NtCreateFile (kernel'da)

Neden Önemli?

  • Zararlılar bazen Win32 API yerine doğrudan Native API çağırır (AV atlatma)
  • Direct syscall tekniğiyle ntdll bile bypass edilebilir
  • API hook’lar genellikle ntdll seviyesinde yapılır

2. Process ve Thread Yapısı

Process Oluşturma

1
2
3
4
5
6
7
8
9
10
11
12
13
CreateProcess çağrıldığında:
  1. PE dosyası bellekte haritalanır (section'lar)
  2. PEB (Process Environment Block) oluşturulur
  3. Ana thread oluşturulur → TEB (Thread Environment Block)
  4. DLL'ler yüklenir → DllMain çağrılır
  5. Entry point çalıştırılır

EPROCESS (kernel yapısı):
  ├── UniqueProcessId → PID
  ├── ImageFileName → process adı
  ├── Peb → PEB adresi (user mode)
  ├── ActiveProcessLinks → process listesi (çift bağlı liste)
  └── Token → güvenlik token'ı

PEB (Process Environment Block)

1
2
3
4
5
6
7
8
9
10
11
12
13
PEB (user mode'dan erişilebilir):
  Offset (32-bit):
  +0x002  BeingDebugged        → Anti-debug kontrolü
  +0x008  ImageBaseAddress     → Yükleme adresi
  +0x00C  Ldr                  → Yüklü DLL listesi
  +0x010  ProcessParameters    → Komut satırı, çevre değişkenleri
  +0x018  ProcessHeap          → Varsayılan heap adresi
  +0x068  NtGlobalFlag         → Debug flag'leri
  +0x0CC  SessionId            → Oturum ID'si

Erişim (Assembly):
  32-bit: MOV EAX, FS:[30h]   → PEB adresi
  64-bit: MOV RAX, GS:[60h]   → PEB adresi

TEB (Thread Environment Block)

1
2
3
4
5
6
7
8
9
10
11
12
13
TEB (her thread için bir tane):
  Offset (32-bit):
  +0x000  SEH chain           → Exception handler zinciri
  +0x004  Stack base           → Stack tabanı
  +0x008  Stack limit          → Stack sınırı
  +0x018  TEB adresi          → Kendinin adresi
  +0x024  Thread ID           → Thread kimliği
  +0x030  PEB adresi          → Bağlı olduğu PEB
  +0x034  LastError           → GetLastError değeri

Erişim:
  32-bit: FS register → TEB base
  64-bit: GS register → TEB base

FS ve GS Register’ları

  • 32-bit Windows: FS register → TEB base adresi
  • 64-bit Windows: GS register → TEB base adresi
  • FS:[30h] → PEB (TEB üzerinden dolaylı)
  • GS:[60h] → PEB (64-bit)

3. DLL Yükleme Mekanizması

DLL Arama Sırası

1
2
3
4
5
6
7
8
9
10
11
LoadLibrary("example.dll") çağrıldığında arama sırası:
  1. Uygulama dizini
  2. System dizini (C:\Windows\System32)
  3. 16-bit system dizini (C:\Windows\System)
  4. Windows dizini (C:\Windows)
  5. Geçerli dizin (Current Directory)
  6. PATH değişkenindeki dizinler

⚠ DLL Hijacking / DLL Side-Loading:
  Zararlı DLL'yi arama sırasında daha önce bulunan bir yere koyarak
  meşru DLL yerine zararlının yüklenmesini sağlama

DLL Main ve Yükleme Olayları

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD reason, LPVOID reserved) {
    switch (reason) {
        case DLL_PROCESS_ATTACH:  // DLL yüklendiğinde
            // Zararlı DLL'ler burada payload başlatır
            break;
        case DLL_THREAD_ATTACH:   // Yeni thread oluşturulduğunda
            break;
        case DLL_THREAD_DETACH:   // Thread sonlandığında
            break;
        case DLL_PROCESS_DETACH:  // DLL kaldırıldığında
            break;
    }
    return TRUE;
}

LDR (Loader Data)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PEB.Ldr → PEB_LDR_DATA:
  InLoadOrderModuleList       → Yükleme sırasına göre DLL listesi
  InMemoryOrderModuleList     → Bellek sırasına göre
  InInitializationOrderModuleList → Başlatma sırasına göre

Her modül → LDR_DATA_TABLE_ENTRY:
  BaseDllName     → DLL adı
  FullDllName     → Tam yol
  DllBase         → Bellek adresi
  EntryPoint      → DllMain adresi
  SizeOfImage     → Bellek boyutu

Kullanım (shellcode'da):
  Shellcode PEB.Ldr'dan kernel32.dll adresini bulur
  → kernel32'den LoadLibrary ve GetProcAddress adreslerini çıkarır
  → Artık her API'ye erişebilir

4. Handles ve Objects

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Windows'ta her kaynak (dosya, process, thread, registry anahtarı)
bir "object" olarak temsil edilir ve "handle" ile erişilir.

Handle:       Bir tablo indeksi (process-local)
Object:       Kernel'daki gerçek veri yapısı

Handle Tablosu (process başına):
  Handle 1 → File Object (C:\test.txt)
  Handle 2 → Registry Key Object (HKCU\Software)
  Handle 3 → Process Object (PID 1234)
  Handle 4 → Mutex Object ("MyMutex")

HANDLE h = CreateFile("test.txt", ...);
  → h = handle değeri (ör: 0x44)
  → Kernel'da dosya objesi oluşturuldu
  → Process handle tablosuna eklendi

CloseHandle(h);
  → Handle tablasundan kaldırıldı
  → Kernel objesi referans sayısı azaltıldı (0 olursa silindi)

Mutex ve Zararlı Yazılım

1
2
3
4
5
6
7
8
9
Zararlılar genellikle bir mutex oluşturarak tekil kopya kontrolü yapar:

CreateMutex(NULL, FALSE, "unique_malware_id");
if (GetLastError() == ERROR_ALREADY_EXISTS) {
    ExitProcess(0);  // Zaten çalışıyor, çık
}

Tespit: Process Hacker → Handles → Mutex isimleri
IoC (Indicator of Compromise): Benzersiz mutex adı

5. Registry

Yapısı

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Registry Hive'ları:
  HKEY_LOCAL_MACHINE (HKLM)     → Sistem geneli ayarlar
  HKEY_CURRENT_USER (HKCU)      → Mevcut kullanıcı ayarları
  HKEY_CLASSES_ROOT (HKCR)      → Dosya ilişkilendirmeleri
  HKEY_USERS (HKU)              → Tüm kullanıcılar
  HKEY_CURRENT_CONFIG (HKCC)    → Donanım profili

Kalıcılık Anahtarları (Zararlılar İçin Kritik):
  HKCU\Software\Microsoft\Windows\CurrentVersion\Run
  HKLM\Software\Microsoft\Windows\CurrentVersion\Run
  HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
  HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
  HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
  HKLM\SYSTEM\CurrentControlSet\Services\{name}

Registry API’leri

1
2
3
4
5
6
7
8
9
10
11
12
// Okuma
RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\MyApp", 0, KEY_READ, &hKey);
RegQueryValueExA(hKey, "Setting", NULL, &type, &data, &size);
RegCloseKey(hKey);

// Yazma (kalıcılık oluşturma)
RegOpenKeyExA(HKEY_CURRENT_USER,
    "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
    0, KEY_WRITE, &hKey);
RegSetValueExA(hKey, "Updater", 0, REG_SZ,
    (BYTE*)"C:\\malware.exe", strlen("C:\\malware.exe")+1);
RegCloseKey(hKey);

6. SEH (Structured Exception Handling)

Mekanizma

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SEH zinciri (stack üzerinde):
  [SEH Record]
    ├── Next → sonraki handler
    └── Handler → exception handler fonksiyon adresi

Exception oluştuğunda:
  1. Son kayıtlı handler'dan başla
  2. Handler'ı çağır
  3. İşleyemediyse sonraki handler'a geç
  4. Hiçbiri işleyemezse → UnhandledExceptionFilter
  5. O da işleyemezse → Process çöker

Assembly'de:
  PUSH handler_address    ; Handler fonksiyonu
  PUSH DWORD FS:[0]       ; Önceki SEH record'u
  MOV  FS:[0], ESP        ; Yeni handler'ı kaydet

SEH ve Exploit

1
2
3
4
5
6
7
8
9
10
SEH Overwrite (Stack Overflow Exploit):
  1. Buffer overflow ile stack taşır
  2. SEH handler adresi üzerine yazılır
  3. Exception tetikle (ör: null pointer)
  4. Kontrol saldırganın yazdığı adrese geçer
  5. → Shellcode çalışır

SafeSEH ve SEHOP:
  Güvenlik mekanizmaları: handler adresinin geçerliliğini kontrol eder
  → Exploit Geliştirme

7. Token ve Yetki Yükseltme

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Her process bir Security Token'a sahiptir:
  ├── User SID → Kullanıcı kimliği
  ├── Group SIDs → Grup üyelikleri
  ├── Privileges → Yetkiler (SeDebugPrivilege vb.)
  └── Integrity Level → Bütünlük seviyesi

Integrity Levels:
  Low    → Sandbox (tarayıcı sekmeleri)
  Medium → Normal kullanıcı processleri
  High   → Yönetici processleri (UAC onaylı)
  System → SYSTEM servisleri

Privilege Escalation:
  Zararlı "Medium" seviyeden "High" veya "System" seviyeye çıkmaya çalışır
  
  Yöntemler:
    UAC bypass → fodhelper.exe, eventvwr.exe registry hijack
    Token manipulation → OpenProcessToken, DuplicateToken
    Named pipe impersonation → SYSTEM token çalma
    Kernel exploit → Ring 3 → Ring 0

Önemli Yetkiler

YetkiAnlamRisk
SeDebugPrivilegeHerhangi bir process’e debug erişimiProcess injection
SeImpersonatePrivilegeBaşka kullanıcı olarak davranmaToken çalma
SeBackupPrivilegeHer dosyayı okumaVeri hırsızlığı
SeTakeOwnershipPrivilegeHerhangi bir nesnenin sahipliğini almaYetki yükseltme
SeLoadDriverPrivilegeKernel driver yüklemeRootkit

8. Servisler (Services)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Windows Servisleri:
  - Arka planda çalışan process'ler
  - Genellikle SYSTEM yetkisiyle
  - Boot sırasında otomatik başlayabilir

Zararlı servis oluşturma:
  sc create MalService binpath= "C:\mal.exe" start= auto
  sc start MalService

Servis tipleri:
  SERVICE_WIN32_OWN_PROCESS → Kendi process'inde çalışır
  SERVICE_WIN32_SHARE_PROCESS → svchost.exe içinde çalışır (gizlenmek için)

Servis konfigürasyon:
  HKLM\SYSTEM\CurrentControlSet\Services\{ServiceName}
    ImagePath → çalıştırılacak dosya
    Start → 2=auto, 3=manual, 4=disabled
    Type → servis tipi

9. Scheduled Tasks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Zamanlanmış görevler = kalıcılık mekanizması

Zararlı komut:
  schtasks /create /tn "WindowsUpdate" /tr "C:\mal.exe" /sc onlogon /ru SYSTEM
  schtasks /create /tn "Updater" /tr "C:\mal.exe" /sc minute /mo 30

Görev dosyaları:
  C:\Windows\System32\Tasks\{TaskName}
  XML formatında — içerikte program yolu ve tetikleyici

Tespit:
  schtasks /query /fo TABLE /v
  Task Scheduler UI
  Procmon → schtasks.exe çalıştırılması

10. WMI (Windows Management Instrumentation)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WMI = Windows'un yönetim altyapısı
Zararlılar WMI ile:
  - Sistem bilgisi toplama
  - Process çalıştırma
  - Kalıcılık oluşturma (event subscription)

Bilgi toplama:
  wmic os get caption,version
  wmic process list brief
  wmic startup list full

Process çalıştırma:
  wmic process call create "C:\mal.exe"

WMI Event Subscription (kalıcılık — tespiti zor):
  EventFilter → tetikleyici koşul (ör: her 5 dakika)
  EventConsumer → çalıştırılacak komut
  FilterToConsumerBinding → ikisini bağla

11. COM (Component Object Model)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
COM = Windows'un component mimarisi
Zararlılar COM'u kullanarak:
  - Internet Explorer kontrolü (C2 iletişimi)
  - Script çalıştırma (WScript.Shell)
  - Dosya sistemi erişimi (Scripting.FileSystemObject)
  - Kalıcılık (COM hijacking)

COM Hijacking:
  1. Meşru bir CLSID'nin InprocServer32 değerini değiştir
  2. Sistem meşru COM nesnesini yüklemeye çalıştığında
  3. Zararlı DLL yüklenir
  
Registry:
  HKCU\Software\Classes\CLSID\{GUID}\InprocServer32
    (Default) = "C:\zararlı.dll"

🔗 Sonraki Adım

Exploit geliştirme temelleri → Exploit Geliştirme Malware Analiz Windows artefaktları → Windows Artefaktları

Bu yazı Creative Commons Atıf 4.0 Uluslararası (CC BY 4.0) lisansı ile yayımlanmıştır.