Windows Internals Notlarım ~ Process
Selamlar, büyük sınav için az vaktim kaldı. Bu yüzden ne projelerime ne de yazılara devam edebiliyorum. Çok kısıtlı vakitte yazdığım bu yazıda hatalar fazlaysa affola…
Bu yazıyı “Windows Internals” (part1 pdf linkini en altta bulabilirsiniz) kitabındaki bir kısmın ve daha birçok kaynaktan derlenmiş bilgilerin türkçeleştirme ve ekleme yapılmış hali olarak düşünebilirsiniz.
Process Internals
Data Structures
Windows üzerinde her süreç bir “Yürütme Süreci” (EPROCESS - Executive Process) olarak temsil edilir. WinDbg üzerinde dt nt!_eprocess
komutu ile nt!_eprocess ‘i dump edelim.
Bir EPROCESS, bir süreçle ilgili birçok özniteliği içermesinin yanı sıra, başka ilgili veri yapılarını da içerir. Örneğin her süreç bir veya daha fazla “thread” yani iş parçacığı içerir (daha sonraki notlarda daha derine ineceğiz). Bunların her biri “Yürütme İş Parçacığı” (ETHREAD) olarak temsil edilir.
Bu kısımda EPROCESS ve bağlantılı diğer veri yapılarının PEB üzerinde bulunduğu ve bu yapıların “user-mode” kod üzerinden erişilebilir olmasını sağlamak amacıyla Process Address Space üzerinde bulunması, “Win32 Subsystem Process” (Csrss)’in her bir süreç için CSR_PROCESS adı verilen bir yapıyı süreç için sağlaması ve bunun detayı gibi konuların çok fazla detayına inmeyeceğim.
Process Initalization Sequence (İşlem Tanımlama Sırası)
CreateProcess Çağırıldığında Ne Olur?
Özellikle Windows üzerinde (linux üzerinde çok iyi değilim o yüzden yorum yapamıyorum) reverse’de daha iyi olabilmek için bir Process(süreç) başladığında ne olur? nasıl başlar? gibi sorulara cevap aramalıyız.
CreateProcess hakkında temel bilgileri edinmek için MSDN sayfasına gidelim. burası
Öncelikle bu dosyayı x32dbg
üzerinde başlatıyorum. “Symbols” sekmesinden .exe dosyamı seçip “_main” fonksiyonuna gidiyorum ve CreateProcessW
API’sine çağrı yaptığım noktayı buluyorum. Şu kısım:
Tamam şimdi ENTER
butonu ile CALL
ettiği fonksiyonu takip edip son olarak atladığı çağrıya gideceğim.
Bu çağrıya da atladığım zaman; Devamını yorumlamaya gerek yok ki zaten bunun sonrasında da başvurulan çağrılara bakarsanız (LdrpInitializeProcess …) bunları anlatacağız adım adım
Şimdi bir sistemde süreç oluşturma sırasında yapılan işlemlerin kısa bir açıklamasını vereceğim.
Yeni bir süreç objesi ve yeni bir adres alanı oluşturmak : Herhangi bir süreç bir Win32 API’si olan
CreateProcess
‘e çağrı yaptığında; yeni bir süreç objesi oluşturulur ve süreç için RAM üzerinden alan tahsis edilir. (CreateProcess’i ayriyeten irdeleyeceğiz)CreateProcess
, süreç için tahsis ettiği alan içerisindeNTDLL.DLL
ve .EXE dosyasını birbiri ile eşler.CreateProcess
, süreç için ilk iş parçacığını (thread) ve onun için stack alanını tahsis eder (RAM’den alan ayırır).Oluşturulan iş parçacığı oluşturulur yalnız çalıştırılmaz. Çalıştırılma işlemi şimdi yapılacak.
- Sürecin önceden oluşturulan ilk iş parçacığı bu aşamada çalıştırılır ve
NTDLL.DLL
arkasındaLdrpInitialize
adlı fonksiyon çalışır. LdrpInitialize
fonksiyonunun temel amacı : birincil çalıştırılabilir dosyanın yani çalıştırdığımız dosyanın import table içerisindeki bütün fonksiyonları yinelemeli olarak atlayıp, dosyanın çalışabilmesi için gerekli olan ikincil dosyaları hafızaya eşler.Bu aşamaya kadar sürecimiz için hafızada bir alan açıldı. Bu alan içerisinde ilk iş parçacığı oluşturuldu ve bu iş parçacığı için bir stack alanı açıldı.
LdrpInitialize
fonksiyonu ile exe dosyamızın çalışabilmesi için gerekli olan ikincil dosyalar hafızaya yüklendi ve eşlendi.- Bu noktada kontrol, hafızaya statik olarak yüklenen DLL dosyalarının başlatılmasından sorumlu tutulan
LdrpRunInitializeRoutines
fonksiyonuna geçirilir. Başlatma işlemi her DLL’nin giriş noktasınınDLL_PROCESS_ATTACH
ile başlatmasıyla sürdürülür. - Tüm DLL’ler başlatıldığında kontrol tekrardan
LdrpInitialize
fonksiyonuna geçer.KERNEL32.DLL
içerisindenBaseProcessStart
fonksiyonu çağırılır. Birincil dosyanınWinMain
giriş noktası aranır ve çağırılır.Olabildiğince açıklamalı ve kısa anlatmaya çalıştım daha güzel(!) ve detaylı gözükmesi için bir de şema çizmeye çalışacağım. …. bu şemanın biçimsel özellikleri hakkında yorum yapmayacağım açıklayıcı olması yeterlidir sanırım.
draw.io
kullanamıyorum.