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
| Yetki | Anlam | Risk |
|---|---|---|
| SeDebugPrivilege | Herhangi bir process’e debug erişimi | Process injection |
| SeImpersonatePrivilege | Başka kullanıcı olarak davranma | Token çalma |
| SeBackupPrivilege | Her dosyayı okuma | Veri hırsızlığı |
| SeTakeOwnershipPrivilege | Herhangi bir nesnenin sahipliğini alma | Yetki yükseltme |
| SeLoadDriverPrivilege | Kernel driver yükleme | Rootkit |
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.