.exe dosyasına çift tıklamak, kullanıcı açısından tek bir harekettir. Windows açısından ise dosya çözümlemesi, yetki denetimi, process ve thread nesnelerinin oluşturulması, executable image’ın sanal adres alanına eşlenmesi, DLL bağımlılıklarının çözülmesi, sayfa korumalarının uygulanması ve ilk instruction’ın CPu’ya teslim edilmesi demektir. Malware bütün bunların üzerine dosya, registry, process ve ağ davranışlarını ekler.
1. Bir .exe Dosyasına Çift Tıkladığınızda Ne Oluyor?
Şunu en baştan düzeltelim, malware çalışmaz, Windows onu çalıştırır. Dosya kendi kendine process oluşturmaz, kendi başına RAM’e yerleşmez ve ağ kartına doğrudan paket yazmaz. Bunların her biri, işletim sisteminin sunduğu bir mekanizma üzerinden gerçekleşir.
Explorer dosyanın open fiilini çözer. Process oluşturma isteği Win32 katmanından Native API katmanına iner. Kernel bir process nesnesi, birincil thread, handle tablosu, access token ilişkisi ve sanal adres alanı kurar. Memory Manager PE dosyasını bir executable image olarak map eder. User-mode loader relocations, imports ve TLS başlangıcını işler. CPU ancak bundan sonra packer stub’a veya gerçek entry point’e gelir. Ardından malware kendini kopyalayabilir, registry’yi değiştirebilir, başka bir process’e erişebilir veya C2 sunucusuna bağlanabilir.
Dolayısıyla asıl sorumuz “malware ne yaptı?” kadar “Windows bu davranışın gerçekleşebilmesi için hangi nesneleri ve geçişleri üretti?” olmalı. İkinci soruyu sormadan birincisine verilen cevap eksik kalır.
2. Analiz
Eski C2 alan adları yeniden kaydedilebilir, loader yeni bir payload alabilir veya örnek DGA üzerinden başka bir hedefe gidebilir. En güvenli tasarım, Windows analiz VM’inin yalnızca kontrollü bir servis simülatörüne ulaşabildiği internal/host-only ağdır. Laboratuvarı çalıştırmadan önce şu kontrolleri yaparım:- Temiz Windows snapshot’ı alınır; dönüş noktası sample VM’e kopyalanmadan önce oluşturulur.
- Shared folders, clipboard sync, drag-and-drop, USB passthrough ve host disk mount özellikleri kapatılır.
- Sanal NIC
bridgedveya gerçek internete çıkanNATyerine internal/host-only moda alınır. - FakeNet-NG Windows üzerinde ya da INetSim ayrı bir Linux/REMnux VM üzerinde sahte DNS ve uygulama servisleri sunar.
- Capture başlamadan process listesi, çalışan servisler, autoruns noktaları ve ağ tablosu baseline olarak kaydedilir.
- Sample hash’leri VM dışında doğrulanır; çalıştırmadan hemen önce ve analiz sonunda tekrar hesaplanır.
Bu örnek PE32/x86 olduğu için x64dbg paketinin x32dbg ön yüzü kullanılmalı. 64 bit Windows üzerinde sample büyük olasılıkla WOW64 altında koşacaktır; bu ayrıntı, syscall geçişini ve iki ayrı mimariye ait loader yapılarının görünmesini doğrudan etkiler.
3. İncelenecek Malware Örneğinin Tanıtılması
Merkezde Amadey ailesine ait, yayımlanmış rapordaamadey.exe olarak yeniden adlandırılan bir örnek var. Dosyanın orijinal adı ObjectHolderListEnumerator.exe. Amadey ailesi 2018’de ortaya çıkan; sistemi profilleyen, C2’den görev alan ve ikincil payload/plugin indirebilen modüler bir Windows botnet/loader ailesi. Malpedia aileyi Ekim 2018 civarına tarihlendiriyor; bu dosya için raporun YARA metadata’sında first_seen değeri 28 Haziran 2021 olarak verilmiş.
Örnek değerleri Siber Vatan Amadey Teknik Analiz Raporu üzerinden alınmıştır:
Bu örneği seçmemin sebebi “en gelişmiş malware” olması değil. Tam tersine, tek bir binary içinde Windows’un çok farklı alt sistemlerine dokunması: packer/obfuscation, anti-debugging, Temp altına self-copy, process bağlamı değişikliği iddiası, WinINet trafiği ve HTTP POST. Böyle bir örnek Windows loader ile malware davranışı arasındaki sınırı açık biçimde göstermeye elverişli.
Dosya boyutu, compile timestamp ve imza durumu için sayı uydurulmadı. Aynı şekilde raporda düz metin olarak verilmeyen OEP adresi, section entropy değerleri ve exact POST body de “ölçülmüş bulgu” gibi sunulmayacak. Profesyonel analizde
unknown, yanlış kesinlikten daha değerlidir.Aşama I — Dosya Henüz Çalıştırılmadı
4. PE Dosyasının Anatomisi — Windows Bu Dosyayı Nasıl Görüyor?
PE, yalnızca makine kodunun paketlendiği bir kutu değildir. Loader’a “hangi mimari için üretildim, adres alanında ne kadar yer istiyorum, ilk kod nerede, hangi DLL’lere ihtiyacım var, section’ların disk ve bellek düzeni nasıl?” sorularının cevabını veren sözleşmedir. Microsoft’un PE/COFF biçim tanımı, dosyanın temel katmanlarını şöyle tarif eder:IMAGE_DOS_HEADER içindeki e_lfanew, PE imzasının dosya offset’ini gösterir. Ardından gelen COFF header makine tipini, section sayısını ve karakteristik bayraklarını taşır. “Optional Header” adı yanıltıcıdır: executable image için pratikte zorunludur. Entry point, image base, alignments, image size ve import/relocation/TLS gibi dizinlerin RVA’ları burada bulunur.
Analizde özellikle şu alanlara bakarım:
RVA ile file offset’i birbirine karıştırmak, PE analizinin klasik hatasıdır. Bir byte’ın diskteki yeri section’ın
PointerToRawData alanıyla, memory içindeki yeri ise VirtualAddress alanıyla ilişkilidir. Basitleştirilmiş dönüşüm şudur:
VirtualSize/SizeOfRawData farkları ayrıca ele alınır.
Standart section isimleri kesin bir kural değildir; yalnızca gelenektir:
Bir packer bu isimleri koruyabilir, değiştirebilir veya tüm payload’ı alakasız isimli tek bir section’a koyabilir. Bu yüzden “
.text var, dosya normal” veya “section adı garip, dosya kesin zararlı” denemez. İsim değil; raw/virtual boyut, entropy, karakteristikler ve runtime davranış birlikte okunur.
5. Entropy, Packing ve Obfuscation Kontrolü
Byte dağılımının Shannon entropy değeri, bir section içindeki verinin ne kadar tekdüze veya rastlantısal göründüğünü ölçer:0–8 bit/byte değeridir. Uzun bir sıfır dizisinin entropy’si düşüktür; sıkıştırılmış ya da şifrelenmiş veri genellikle 8’e yaklaşır. Fakat “7.2 üstü malware” gibi evrensel bir eşik yoktur. JPEG/PNG kaynakları, sıkıştırılmış installer verileri ve meşru kriptografik tablolar da yüksek entropy üretir.
Bu örnek için rapor iki önemli bulgu yayımlıyor:
- DIE, dosyayı packed/obfuscated olarak değerlendiriyor.
.text,.rdata,.data,.relocve.rsrcdışında üç ek şifreli section bulunduğu belirtiliyor.
Entropy yalnızca “nereye bakmalıyım?” sorusunu cevaplar. Packing’i doğrulayan an, debugger’da stub’ın bir bölgeyi yazması/decode etmesi, sayfa korumasını executable yapması ve kontrolü yeni koda devretmesidir.
6. Import Table — Malware Daha Çalışmadan Bize Ne Söylüyor?
Import table kesin bir davranış listesi değil, binary’nin loader’dan çözmesini istediği bağımlılıkların listesidir. Bir API’nin import edilmesi çağrıldığı anlamına gelmez; çağrılan API de import table’da görünmeyebilir. Malware isimleri runtime’da çözebilir, ordinal kullanabilir, API hash uygulayabilir veya syscall’a doğrudan gidebilir. Raporun yayımladığı API listesi bu örnek için daha güvenli bir başlangıç sunuyor:
Kullanışlı bir ayrım şudur:
VirtualAllocyalnızca çağıran process’in adres alanını hedefler.VirtualAllocExbaşka bir process’in adres alanını hedefleyebilir.WriteProcessMemoryremote process’e veri yazar.CreateRemoteThreadremote address space içinde thread oluşturur.
WriteProcessMemory ve CreateRemoteThread yok. Bu nedenle bu örneğin o klasik zinciri kullandığını varsaymak yerine debugger, ETW/Sysmon ve process access telemetrisiyle yöntem belirlenmeli.
7. Strings Analizi — Binary’nin Bıraktığı Küçük İpuçları
Strings çıktısı bazen bir binary’nin en konuşkan kısmıdır, bazen de packer yüzünden neredeyse tamamen sessizdir. ASCII ve UTF-16LE birlikte aranmalı; yalnızcastrings.exe çıktısına değil, length-prefixed dizilere, stack üzerinde kurulan stringlere ve decode sonrası memory’ye de bakılmalıdır.
Bu örnek için yayımlanmış artefact’lar şunlar:
String analizi sırasında her bulguya en az üç soru sorarım:
- Bu string dosyada düz metin mi, decode edilmiş memory’de mi bulundu?
- Stringe cross-reference var mı; hangi basic block’ta kullanılıyor?
- Runtime’da gerçekten bir API argümanına dönüşüyor mu?
Aşama II — Kullanıcı Malware’i Çalıştırıyor
8. Çift Tıklamadan CreateProcess’e
Explorer bir .exe için varsayılan open fiilini işletir. Shell katmanı file association, App Paths, çalışma dizini, UAC gereksinimi ve başka kabuk davranışlarını değerlendirir. Basitleştirilmiş zincir şu şekilde gösterilebilir:
Bu bir kavramsal call path’tir, ABI garantisi değildir. Windows build’ine, elevation isteğine, application compatibility katmanına ve shell association davranışına göre ara fonksiyonlar değişebilir. Microsoft’un UAC mimarisi, elevation gerektiğinde ShellExecute yolunun Application Information service ile ayrılabileceğini gösterir.
ShellExecuteExW, “bu dosya türüyle ne yapılır?” sorusunu çözen yüksek seviye Shell API’sidir. CreateProcessW ise doğrudan bir executable image ve command line ile yeni process ve primary thread oluşturma sözleşmesini sunar. Microsoft’un CreateProcessW belgelerine göre yeni process varsayılan durumda çağıran process’in güvenlik bağlamında başlar.
Modern Windows’ta kernel32.dll içindeki birçok export’un uygulaması KernelBase.dll tarafına yönlendirilir. Ardından desteklenen Win32 sözleşmesinin altındaki Native API kullanılır. NtCreateUserProcess uygulama geliştiricileri için kararlı, belgelenmiş bir Win32 API değildir; malware analistinin call stack’te gördüğü iç katmandır.
9. User Mode’dan Kernel Mode’a Geçiş
CreateProcessW bir syscall instruction’ı değildir. Parametre doğrulama, command line ayrıştırma, environment ve attribute hazırlığı gibi önemli işlerin bir bölümü user mode’da yapılır. Native API sınırında ntdll.dll devreye girer. Microsoft, user-mode uygulamaların Native System Services girişlerine ntdll.dll üzerinden ulaştığını ve bu entry point’lerin çağrıyı kernel mode’a trapped system call’a çevirdiğini Windows driver belgelerinde açıklar.
Ring 3 kodu kendi başına kernel yapılarına erişemez. CPU
syscall/mimariye özgü geçiş mekanizmasıyla daha ayrıcalıklı yürütme bağlamına geçer; kernel user pointer’larını güvenilmeyen girdi olarak doğrular. Nt ve Zw servisleri hakkındaki Microsoft açıklaması, user mode’dan gelen parametrelerin probe ve validation sürecinden geçtiğini vurgular.
Bu sample x86 olduğu için önemli bir nüans var. 32 bit Windows üzerindeki geçiş ile 64 bit Windows’ta WOW64 altındaki geçiş aynı değildir. WOW64 senaryosunda x86 ntdll çağrısı 64 bit syscall dünyasına bir compatibility katmanı üzerinden ulaşır. Dolayısıyla “EAX’e syscall numarası yazdı, syscall çalıştı” cümlesi x64 stub için öğretici olabilir; PE32 örneğin gerçek yolunu tek başına tarif etmez. Ayrıca system service number’lar Windows build’leri arasında sabit değildir. Hard-code edilmiş syscall tablosunu evrensel kabul etmek hatalıdır.
10. Windows Kernel Yeni Process’i Nasıl Oluşturuyor?
Kernel’e geçildiğinde “process” tek bir struct’tan ibaret değildir. Object Manager tarafından yönetilen process ve thread nesneleri, Memory Manager’ın adres alanı yapıları, Security Reference Monitor’ün token kontrolleri ve handle’larla erişilen kernel nesneleri birlikte kurulur. Microsoft,EPROCESS ve ETHREAD yapılarını açıkça opaque olarak tanımlar; layout sürüme göre değişebilir. Windows Kernel Opaque Structures dokümanına göre EPROCESS kernel’in process nesnesi, ETHREAD ise thread nesnesidir.
PID bir kernel pointer değildir. Handle da global bir nesne adresi değildir; process’in handle table’ındaki, access mask ile sınırlandırılmış bir girişe işaret eder. Malware başka bir process’i
OpenProcess ile açtığında aslında “PID’ye sahip olmaktan” çok, hedef process nesnesine belirli haklarla bir handle edinmeye çalışır.
Birincil thread oluşturulsa bile CPU doğrudan malware’in OEP’ine bırakılmaz. Başlangıç bağlamı önce user-mode loader başlangıç yoluna gider; çağrı zincirinde build’e göre ntdll!LdrInitializeThunk ve RtlUserThreadStart gibi rutinler görülür. Loader işi bittikten sonra kontrol executable entry point’e teslim edilir.
Aşama III — Windows PE Loader Devreye Giriyor
11. Malware RAM’e Nasıl Map Ediliyor?
“Windows EXE’yi RAM’e kopyalar” cümlesi giriş seviyesinde iş görür, fakat teknik olarak yetersizdir. Executable file için bir image section nesnesi kurulur ve bu image process’in sanal adres alanına map edilir.SEC_IMAGE, file mapping’in executable image olduğunu belirtir; sayfa korumaları genel bir PAGE_READWRITE tercihiyle değil PE image’ın kendi section özellikleriyle belirlenir. Bu davranış CreateFileMapping SEC_IMAGE belgelerinde açıklanır.
Buradaki kritik sonuçlar şunlar:
- File offset ile virtual address aynı değildir.
- Tüm image’ın bütün byte’ları ilk anda fiziksel RAM’e gelmek zorunda değildir; demand paging devrededir.
- Aynı DLL’nin salt okunur executable sayfaları birden fazla process arasında fiziksel olarak paylaşılabilir.
- Process bir copy-on-write sayfayı değiştirdiğinde kendisine özel bir fiziksel kopya oluşabilir.
- Section’ın memory koruması
.textiçin executable/read,.dataiçin read/write gibi PE karakteristiklerinden türetilir.
12. Virtual Memory — Malware Gerçekte Nerede Yaşıyor?
Her user-mode process’in kendine ait sanal adres alanı vardır. Aynı virtual address iki farklı process’te tamamen farklı fiziksel sayfalara gidebilir. Microsoft’un Virtual Address Spaces açıklaması, process izolasyonunun temelini bu eşlemeye dayandırır.2^32 byte’tır. Bunun kullanıcıya açık bölümü işletim sistemi, boot seçenekleri ve LARGE_ADDRESS_AWARE bayrağına göre değişir. 64 bit Windows’ta WOW64 altında çalışan, large-address-aware olmayan tipik bir x86 process çoğunlukla 2 GB user-mode alana sahiptir; large-address-aware x86 image daha geniş alan görebilir. Bu yüzden “x86 her zaman tam 4 GB kullanır” da “x86 yalnızca 2 GB’tır” da bağlamsız söylendiğinde eksiktir.
Sanal bir sayfanın üç temel state’i vardır: free, reserved ve committed. VirtualAlloc önce bir adres aralığını reserve edebilir, sonra sayfaları commit edebilir. Commit, fiziksel RAM’in o anda mutlaka bağlandığı anlamına gelmez; ilk erişime kadar actual page materialization gecikebilir. Microsoft’un VirtualAlloc belgeleri bu ayrımı açıkça yapar.
Malware analizi açısından memory bölgesinin dört özelliği özellikle değerlidir:
- Type:
MEM_IMAGE,MEM_MAPPEDveyaMEM_PRIVATE. - State: reserved/committed.
- Protection:
R,RW,RX,RWX, guard vb. - Backing: Diskte hangi file’a bağlı olduğu veya private olması.
MEM_PRIVATE + RX/RWX bir bölgeye taşınması, mapped image içindeki normal .text yürütmesinden farklı bir iz bırakır.
13. PEB ve TEB — Malware’in Windows Hakkındaki Bilgi Kaynağı
PEB, user-mode process’in loader ve process başlangıcıyla ilgili kritik state’ini taşır. TEB ise thread’e özgü state’i tanımlar. Bunlar kernel’inEPROCESS/ETHREAD nesneleri değildir; user address space içinde bulunan ve user-mode kod tarafından okunabilen yapılardır.
Microsoft, PEB yapısındaki
BeingDebugged alanını belgeler; fakat yapının internal olduğunu ve layout’un değişebileceğini de özellikle belirtir. TEB belgeleri de aynı sürüm bağımlılığı uyarısını taşır.
Mimari seviyede x86 kod genellikle TEB’e FS segmenti, x64 kod ise GS segmenti üzerinden ulaşır. Sık görülen kalıplar x86 için FS:[0x30], x64 için GS:[0x60] üzerinden PEB pointer’ını almaktır. Fakat WOW64’ta 32 ve 64 bit dünyalara ait paralel yapıların bulunabileceği unutulmamalı.
Malware neden PEB okur?
- Import bırakmadan yüklü DLL base adreslerini bulabilir.
kernel32.dll/ntdll.dllexport table’larını kendi koduyla gezebilir.- API isimlerini hashleyerek manuel resolution yapabilir.
BeingDebuggedile basit anti-debug kontrolü gerçekleştirebilir.- Command line, image path veya environment üzerinden sandbox ipuçları arayabilir.
fs:/gs: segment erişimi görmek önemlidir; fakat her segment erişimi zararlı değildir. Compiler runtime’ları, exception handling ve thread-local storage da aynı yapıları meşru biçimde kullanır.
14. DLL’ler Nasıl Yükleniyor?
Loader PE’nin Import Directory’sini okuyarak herIMAGE_IMPORT_DESCRIPTOR için gerekli DLL’yi bulur ve process’e map eder. Ana executable’ın tipik bağımlılıkları ntdll.dll, kernel32.dll, KernelBase.dll, advapi32.dll, user32.dll ve ağ gerekiyorsa wininet.dll/winhttp.dll olabilir.
DLL yükleme iki ana biçimde görünür:
- Implicit import: DLL ve fonksiyonlar PE import table’da kayıtlıdır; loader process başlangıcında çözer.
- Explicit/dynamic load: Kod
LoadLibrary*ile modülü,GetProcAddressile export’u runtime’da ister.
DllMain(DLL_PROCESS_ATTACH) çağrılır. Ancak modern Windows’ta çözüm her zaman “import edilen isimdeki DLL içinde son adres” kadar basit değildir. API Set şeması logical contract adlarını host DLL’lere yönlendirebilir; export forwarder bir fonksiyonu kernel32 isminden KernelBase uygulamasına aktarabilir.
Rapor bu örneğin runtime sırasında wininet.dll, GdiPlus.dll, shell32.dll, user32.dll ve başka modülleri yüklediğini belirtiyor. Bu listeyi davranışla bağlamak gerekir: wininet.dll C2 zinciriyle, GdiPlus.dll ise görüntü işleme API’leriyle uyumludur. Yine de yalnızca DLL load görmek, içindeki belirli fonksiyonun çağrıldığını kanıtlamaz.
15. Import Address Table Nasıl Dolduruluyor?
Compiler bir dış fonksiyonun runtime adresini bilemez. Onun yerine call/jump instruction’ını IAT slot’una yöneltir. Loader ilgili export’u bulunca gerçek virtual address’i o slota yazar. Kabaca akış şöyledir:- Loader import descriptor’dan DLL adını okur.
- Modül henüz yoksa map eder ve bağımlılıklarını çözer.
- Import thunk’tan fonksiyon adı veya ordinal alınır.
- Export directory ve olası forwarder/API Set yönlendirmesi çözülür.
- Son adres IAT slot’una yazılır.
- Loader geçici olarak writable yaptığı IAT sayfalarını uygun korumaya geri çevirir.
16. ASLR ve Base Relocation
PE header’dakiImageBase, image’ın tercih ettiği adrestir; söz verilmiş adres değildir. Bu aralık doluysa veya ASLR image’ı randomize ediyorsa loader başka bir load base seçer. Aradaki fark relocation delta’dır:
.reloc section’ındaki base relocation table, sayfa RVA’sı ve o sayfadaki relocation entry’lerinden oluşan bloklar taşır. Bu sample x86 olduğundan tipik absolute fixup türü IMAGE_REL_BASED_HIGHLOW olur; x64 image’larda IMAGE_REL_BASED_DIR64 görülür. Microsoft’un Exploit Protection ASLR açıklaması, relocation tablosunun image tercih edilen base’e yüklenemediğinde mutlak referansları düzeltmek için kullanıldığını açıklar.
Debugger’da adresler her çalıştırmada değiştiğinde değişmeyen şeyi kaydetmek gerekir: raw VA değil, module_base + RVA. Örneğin breakpoint notunu 0x75A41230 diye yazmak yerine amadey.exe+0x1230 şeklinde tutmak yeniden üretilebilir analiz sağlar.
Relocation table’ın varlığı ASLR’ın gerçekten etkin olduğu anlamına tek başına gelmez; DYNAMIC_BASE gibi DllCharacteristics bayrakları ve runtime load base birlikte incelenir. Benzer şekilde relocation table’ın kaldırılması da otomatik olarak malware göstergesi değildir; fakat image tercih edilen base’e yüklenemezse çalışabilirliği etkiler.
17. TLS Callback — Entry Point’ten Önce Çalışan Kod
PE TLS Directory, thread-local verinin yanında callback pointer dizisi taşıyabilir. Loader, uygulamanın normal entry point’ine geçmeden önce TLS callback’lerini çalıştırabilir. Malware analistinin “entry point’e breakpoint koydum, ilk kodu yakalarım” varsayımı bu nedenle her zaman doğru değildir. TLS callback içinde şunlar yapılabilir:PEB.BeingDebuggedveya başka debugger kontrolleri,- environment/VM kontrolü,
- string decode,
- unpack buffer hazırlığı,
- exception handler kurulumu,
- asıl entry point’i hiç çalıştırmadan process sonlandırma.
Aşama IV — İlk Malware Talimatı Çalışıyor
18. Entry Point — CPU Malware Kodunu Çalıştırmaya Başlıyor
AddressOfEntryPoint bir RVA’dır. Runtime virtual address şu şekilde hesaplanır:
0x00400000, entry point RVA’sı 0x00001230 olsaydı ve image tercih edilen base’e yüklenseydi VA 0x00401230 olurdu. ASLR sonucu runtime base 0x00670000 ise aynı RVA 0x00671230 adresine taşınır.
Bu Amadey örneğinin gerçek ImageBase ve AddressOfEntryPoint değerleri kaynak raporda yayımlanmadığı için burada örneğe ait sahte bir adres vermiyorum. Gerçek laboratuvarda süreç şudur:
- PE-bear’da Optional Header’dan
AddressOfEntryPointkaydedilir. - x32dbg Modules görünümünden runtime module base alınır.
- İkisi toplanır ve module-relative breakpoint konur.
- Breakpoint geldiğinde EIP, stack top, memory region type/protection ve call stack kaydedilir.
jmp hedefini görmekle değil; normal code yoğunluğu, anlamlı imports, stabil control flow ve ikinci çalıştırmada yeniden üretimle yapılır.
19. Assembly Seviyesinde İlk Talimatlar
Burada en değerli an son satırdır.
EDI gerçekten MEM_PRIVATE ve executable bir bölgeyi gösteriyorsa; aynı bölge biraz önce yazılmışsa; instruction entropy’si artık normal code’a benziyorsa packer stub’dan payload’a geçiş yakalanmış olabilir. Fakat jmp edi tek başına unpacking kanıtı değildir. JIT motorları ve meşru runtime’lar da dinamik code üretir; örnek bağlamı belirleyicidir.
Aşama V — Malware Windows’u Tanımaya Başlıyor
20. System Discovery — “Ben Nerede Çalışıyorum?”
Malware için bilgisayar adı yalnızca istatistik değildir. C2 panelinde kurbanı tekilleştirmek, doğru mimariye payload seçmek, yönetici yetkisi gerektiren görevi göndermek, belirli dil/bölgeyi filtrelemek ve sandbox olasılığını puanlamak için kullanılır. Amadey ailesinin farklı sürümlerinde işletim sistemi, kullanıcı, bilgisayar adı, domain, mimari, yönetici durumu ve kurulu güvenlik ürünü bilgileri toplandığı belgelenmiştir. İncelediğimiz rapor ayrıca üç Windows cache.db dosyasına erişildiğini ve bunların sistem bilgisiyle ilişkilendirildiğini belirtiyor. Fakat exact API-to-field eşlemesi yayımlanmadığı için aşağıdaki tablo sample sonucu değil, debugger’da doğrulanacak Windows API haritasıdır:
GetVersionEx sonuçları manifest’e göre compatibility değeri döndürebildiğinden malware’ler bazen RtlGetVersion veya build number gibi daha düşük seviye kaynaklara gider. Benzer biçimde 32 bit process’in SYSTEM_INFO sonucu ile host’un native mimarisi farklı olabilir; WOW64 ayrımı yapılmadan x86 machine sonucu çıkarılamaz.
System discovery fonksiyonunu reverse ederken en verimli yöntem, her API’yi tek tek kovalamak değil, C2 request builder’dan geriye yürümektir. POST buffer’a eklenen alanların source register/pointer’ları izlenir; bu pointer’ların hangi toplama fonksiyonundan geldiği bulunur. Böylece yüzlerce system API çağrısı arasından gerçekten exfiltration’a giren veriler ayrılır.
21. API Resolution — Malware Neden API İsimlerini Saklıyor?
Import table savunmacıya çok erken bilgi verir. Bunu azaltmanın klasik yolu, API’leri runtime’da çözmektir. Malware zaten yüklenmiş modülleri PEB loader listelerinden bulur, hedef DLL’nin PE export directory’sini parse eder ve istediği export’un adresini hesaplar. İşlem kavramsal olarak şöyledir:- TEB’den PEB pointer’ı alınır.
PEB_LDR_DATAiçindeki module listeleri gezilir.- DLL adı case-insensitive karşılaştırılır veya hashlenir.
- Module base’den DOS/NT header ve Export Data Directory bulunur.
AddressOfNames,AddressOfNameOrdinalsveAddressOfFunctionstabloları eşleştirilir.- Export forwarder varsa ikinci modül/isim çözülür.
ror/rol/xor/add benzeri dönüşüm ve bir constant karşılaştırmasıdır.
Burada iki yanlış pozitif kaynağı var. Birincisi, meşru packer/protector ve oyun anti-cheat’leri de manuel resolution kullanabilir. İkincisi, compiler-generated loader kodu ile malware’in custom resolver’ı aynı şey değildir. Ayırt edici olan resolver’ın caller’ı, çözdüğü API seti ve sonraki davranıştır.
Bu Amadey raporunda LoadLibraryA ve LoadLibraryExW listeleniyor; ancak API hashing algoritması veya PEB tabanlı resolver bu hash için açıkça yayımlanmamış. Dolayısıyla ailede görülen obfuscation davranışını bu sample’a otomatik yapıştırmamak gerekir.
22. Mutex Kullanımı — “Bu Makineyi Daha Önce Enfekte Ettim mi?”
Named mutex, process’ler arası tek-instance kontrolünün ucuz yoludur.CreateMutexW aynı isimli nesne varsa mevcut nesneye bir handle döndürebilir; çağıran kod GetLastError() == ERROR_ALREADY_EXISTS sonucuyla ikinci kopya olduğunu anlayabilir.
Tipik karar akışı şöyledir:
CreateMutexW bulunuyor, fakat mutex adı yayımlanmamış. Analiz sırasında yalnızca API breakpoint’i yeterli değildir; lpName argument’i çağrı anında okunmalı, namespace (Local\, Global\ ya da adsız), security descriptor ve dönüşten sonraki GetLastError branch’i kaydedilmelidir.
Process Explorer’ın handle görünümü veya WinObj aynı mutex’i gösterebilir. Fakat mutex adına göre aile atfı kırılgandır: builder her build için rastgele ad üretebilir, aynı isim meşru yazılımda bulunabilir veya malware mutex oluşturmadan da tek instance kontrolü yapabilir.
Aşama VI — Anti-Analysis Mekanizmaları
23. Anti-Debugging
Raporun sample-spesifik anti-debug bulguları şunlar:IsDebuggerPresent, SetUnhandledExceptionFilter ve UnhandledExceptionFilter API’leri listeleniyor; runtime’da DbgBreakPoint/exception davranışı ve thread resume akışı gözlemlendiği yazılıyor. Metindeki DbgBreakPoint açıklaması bazı ayrıntıları genelleştiriyor; bu nedenle exact control flow ancak debugger trace’iyle yeniden doğrulanmalı.
Anti-debug tekniklerini ayrı sinyaller olarak okumak daha sağlıklıdır:
Microsoft’un
NtQueryInformationProcess belgeleri, ProcessDebugPort için sıfır olmayan değerin Ring 3 debugger kontrolünü gösterebildiğini belirtir. Aynı belge bu Native API’nin değişebileceği uyarısını da taşır.
Exception tabanlı kontrolde önemli olan “exception oluştu” değil, exception’ın kim tarafından ve hangi sırada işlendiğidir. Debugger first-chance exception’ı görür; analyst ayarına göre devam ettirir, tüketir veya uygulamaya iletir. Malware özel handler’ın çalışıp çalışmamasını bir oracle olarak kullanabilir. Bu yüzden x32dbg log’unda exception code, address, first/second chance durumu ve son handler path’i birlikte tutulmalıdır.
Anti-debug sinyali tespit edildiğinde hemen patch uygulamak analiz bütünlüğünü bozabilir. Önce davranış kaydedilir, temiz snapshot’tan debugger’sız kontrol koşusu alınır, ardından gerekiyorsa tek değişkenli deney yapılır. Aksi halde bypass sonrası görülen davranışın sample’a mı analistin müdahalesine mi ait olduğu belirsizleşir.
24. Anti-VM ve Sandbox Detection
VM tespiti çoğu zaman tek bir “VMware var mı?” kontrolü değildir; düşük güvenilirlikli birçok sinyalin puanlanmasıdır. Her sinyal gerçek kullanıcı sistemlerinde yanlış pozitif üretebilir.
Analiz VM’ini “gerçekçi göstermek” için sahte kişisel veri doldurmak yerine hangi check’in hangi karar branch’ini etkilediğini izlemek daha değerlidir. Runtime’da registry/file query’lerini Procmon’da filtreleyin; CPUID ve timing loop’larını debugger’da not edin; düşük kaynak koşulunda ve normal kaynak koşulunda iki kontrollü koşu karşılaştırın.
Bu hash için kaynak rapor açık bir anti-VM tekniği yayımlamıyor. Amadey ailesinde başka sürümlerde path/resource tabanlı anti-sandbox kontrolleri görülmüş olsa da bu sample’a ait kanıt olarak sunulmamalıdır.
25. Sleep ve Time-Based Evasion
Sleep import’u raporda bulunuyor. Fakat her Sleep anti-sandbox değildir. Thread senkronizasyonu, polling aralığı, retry backoff ve C2 beacon interval de aynı API’yi kullanabilir. Evasion demek için süre, çağrı bağlamı ve uyandıktan sonraki davranış gerekir.
Yaygın kalıplar:
- Uzun
Sleep/NtDelayExecutionile kısa süreli sandbox penceresini aşmak, GetTickCount64veya uptime ile yeni boot edilmiş ortamı elemek,QueryPerformanceCounter/RDTSCile single-step veya sleep acceleration farkını ölçmek,- Birkaç farklı saat kaynağını karşılaştırarak hook/fast-forward tespit etmek,
- Kullanıcı input’u gelene kadar payload path’ini ertelemek.
Aşama VII — Malware Kendini Sisteme Yerleştiriyor
26. Dosya Sistemi Üzerindeki Değişiklikler
Process Monitor, Win32 API adlarını değil çoğu zaman I/O Manager seviyesine daha yakın operasyonları gösterir. KodCreateFileW çağırırken Procmon’da CreateFile, QueryOpen, WriteFile, SetDispositionInformationFile gibi satırlar görülebilir. Bu nedenle decompiler’daki tek API çağrısı Procmon’da birden fazla event üretir.
Raporlanan sample akışı şu artefact’ları içeriyor:
Rapor ayrıca debugger koşusunda masaüstünde Unpacked.exe üretildiğini ve bunun ana EXE ile aynı olduğunun gözlemlendiğini belirtiyor. “Aynı” sözcüğü burada hash-equal mı, içerik/işlev olarak aynı mı açık değil; gerçek analizde üç hash de karşılaştırılmalıdır.
Procmon görünümünde şu alanlar birlikte saklanır:
CreateFile satırı yeni dosya yaratıldığı anlamına gelmeyebilir; OPEN_EXISTING, query veya directory probe için de görülebilir. Disposition: Create/Overwrite ve sonraki WriteFile olayları birlikte okunmalıdır. CloseFile davranışı da tek başına semantik değildir; önemli olan handle kapanmadan önce hangi byte aralıklarının yazıldığıdır.
27. Registry Üzerindeki Hareketler
Registry erişimini üç kategoriye ayırmak yararlıdır:- Discovery: OS, locale, software veya policy bilgisi için
RegQueryValue. - Configuration: Malware’in kendi state/campaign verisini saklaması.
- Persistence/defense evasion: Autorun, service, task veya policy anahtarlarını değiştirmesi.
RegOpenKeyExW, RegQueryValueExW, RegSetValueExW çağrıları Native API’de NtOpenKey, NtQueryValueKey, NtSetValueKey biçiminde görülebilir. Procmon ise RegOpenKey, RegQueryValue, RegSetValue gibi operasyon adları sunar. Aynı davranışın üç isim katmanına sahip olması analiz notlarında sık karışır.
Bu sample raporu belirli bir Run/RunOnce key yazımı yayımlamıyor. Bu nedenle “Amadey registry persistence yaptı” cümlesi bu hash için kanıtlanmış değildir. Aranması gereken yerler şunlardır:
Registry snapshot diff’i, Procmon capture ve ilgili Event Log birlikte kullanılmalıdır. Yalnızca final state’e bakmak, malware’in yazıp sildiği geçici value’ları kaçırabilir; yalnızca Procmon’a bakmak ise son state’in gerçekten kalıcı olup olmadığını göstermez.
28. Persistence — Bilgisayar Yeniden Başlatıldığında Nasıl Geri Geliyor?
Bu örnek için rapor%TEMP%\fc76a6c9ea\drbux.exe kopyasını “kalıcılık” ile ilişkilendiriyor ve kodun taskeng.exe altında çalıştığını söylüyor. Burada analitik olarak iki ayrı iddia var:
- Binary kendini başka bir konuma kopyaladı.
- Bu kopyayı gelecekte yeniden başlatacak bir scheduler/autorun mekanizması kurdu.
taskeng.exe, Task Scheduler engine/host process’idir; Task Scheduler service’in kendisiyle bire bir aynı kavram değildir.
Scheduled task hipotezini doğrulamak için şu kanıt zinciri gerekir:
taskeng.exe → drbux.exe görmek güçlü bir runtime kanıtıdır; fakat injection ile normal task launch birbirinden ayrılmalıdır. Eğer drbux.exe ayrı child process olarak başlıyorsa bu task execution olabilir. Eğer taskeng.exe image’ı altında private executable memory ve sample’a ait network/file davranışı varsa process injection hipotezi güçlenir.
Amadey ailesinin başka sürümlerinde Run/RunOnce, User Shell Folders ve scheduled tasks raporlanmıştır. Splunk’ın Amadey araştırması bu aile düzeyi yöntemleri belgeliyor. Fakat farklı build’lerin davranışını bu 2021 hash’inin observed behavior’ı gibi yazmak doğru değildir.
Aşama VIII — Process Injection Varsa İçeri Giriyoruz
29. Malware Neden Başka Bir Process’in İçine Giriyor?
Başka bir process bağlamında kod çalıştırmanın birkaç ayrı getirisi olabilir:- Process listesinde malware dosya adı yerine tanıdık bir host adı görünür.
- Ağ bağlantısı ve file I/O host process’e atfedilebilir.
- Hedef process’in token ve erişebildiği kaynaklar kullanılabilir; ancak injection otomatik privilege escalation değildir.
- Basit parent/child veya image-path kuralları zorlanır.
- Orijinal loader process’i kapanırken payload yaşamaya devam edebilir.
explorer.exe, svchost.exe, browser process’leri veya taskeng.exe aynı trust/yetki/ömür özelliklerine sahip değildir. Malware’in hedefi nasıl bulduğu, hangi access mask ile açtığı ve target bitness’in sample ile uyumu yöntemin parçasıdır.
30. Injection Zincirinin Windows API Seviyesinde Analizi
Klasik anlatı dört kutudan oluşur; gerçek analizde her ok için ayrı kanıt gerekir:
Microsoft’a göre
WriteProcessMemory, hedef process handle’ında PROCESS_VM_WRITE ve PROCESS_VM_OPERATION hakları ister; CreateRemoteThread ise ek olarak thread oluşturma ve query hakları gerektirir. Bu access mask’ler EDR telemetrisinde önemli bir bağlam üretir.
Bu Amadey sample’ı için kaynak rapor taskeng.exe içine injection iddiasında bulunuyor. Aynı rapor CreateProcessA, SuspendThread, ResumeThread ve VirtualAlloc API’lerini listeliyor; fakat VirtualAllocEx, WriteProcessMemory, CreateRemoteThread, SetThreadContext veya NtUnmapViewOfSection zincirini yayımlamıyor. Özellikle VirtualAlloc, remote değil çağıran process’te allocation yapar.
Bu durumda doğru sonuç “injection kesin” değil, “host context değişikliği raporlanmış; exact technique eksik”tir. Şunlar toplanmadan hollowing, remote-thread injection veya başka bir teknik adı verilmemelidir:
- Hedef process handle’ı ve granted access mask,
- Hangi PID’nin adres alanında yeni region oluştuğu,
- Region type/protection ve backing file,
- Byte’ların hangi API/stack üzerinden taşındığı,
- Yeni thread start address veya değiştirilen thread context,
taskeng.exeiçindeki network/file davranışının hangi TID’den geldiği.
Aşama IX — C2 İletişimi Başlıyor
31. DNS Çözümlemesinden TCP Bağlantısına
Bir domain stringi doğrudan Ethernet frame’e dönüşmez. Uygulama katmanından NIC’e kadar birkaç ayrı state machine devreye girer: DNS çözümü local cache, hosts file, DNS Client service ve yapılandırılmış resolver’lar nedeniyle her koşuda wire üzerinde görünmeyebilir. “Wireshark’ta DNS yok, domain kullanılmadı” sonucu bu yüzden hatalı olabilir. Capture öncesi cache state’i kaydedilmeli; API breakpoint, ETW DNS event’i ve packet capture birlikte değerlendirilmelidir. Rapor, sample’ın şu iki defanged hedefe ulaşmaya çalıştığını belirtiyor:194.58.103.2.cloudvps.regruhosting[.]rubethdahleen[.]com
32. Windows Network API’leri
Raporlanan API seti bu sample’ın WinINet kullandığını güçlü biçimde gösteriyor:InternetOpenA, InternetConnectA, HttpOpenRequestA, InternetWriteFile, InternetReadFile ve InternetOpenUrlW.
WinINet handle hiyerarşisi şöyledir:
HttpOpenRequest request metadata’sını ve header state’ini hazırlar; network send’in o satırda mutlaka gerçekleşmesi gerekmez. Microsoft’un HttpOpenRequest belgeleri, request handle’ın gönderilecek HTTP header’larını taşıdığını açıklar.
WinINet import’u HTTP semantiğini gösterir; TCP’nin altında yine Windows networking stack vardır. Winsock import’u görünmemesi “socket yok” anlamına gelmez, çünkü WinINet alt katmanları bunu malware adına kullanır.
33. Wireshark ile Paket Seviyesinde İnceleme
Kontrollü ağda capture, sample başlamadan birkaç saniye önce açılır. VM’nin IP/MAC bilgisi kaydedilir ve filtreler adım adım daraltılır:
Paket okuma sırası:
- DNS query name, type ve response address kaydedilir.
- SYN’in destination IP/port’u ve three-way handshake sonucu incelenir.
- HTTP method, Host, URI, User-Agent, Content-Type ve Content-Length çıkarılır.
- POST body binary mi, form-urlencoded mı, base64-benzeri mi değerlendirilir.
- Server response varsa status, body ve indirilen object hashlenir.
- Aynı TCP stream içindeki retry/redirect/task request’leri ayrılır.
InternetWriteFile/HttpSendRequest öncesinde debugger veya API tracing ile alınmalı; packet capture yalnızca wire karşılığını doğrulamalıdır. Bu rapordaki örnek için açık HTTP POST davranışı belirtilmiştir.
34. C2 Request’in Reverse Engineering’i
Bu sample’ın exact POST body ve field delimiter’ları rapor metninde yayımlanmıyor. Aynı aileye ait daha yeni bir 3.83 örneğini inceleyen Splunk araştırması, aşağıdaki alanları belgeler. Bu tablo aile düzeyi referanstır, 2021 hash’inin paketi olarak sunulmamalıdır:
POST buffer’ı reverse ederken ağdan koda doğru değil, koddan ağa doğru bir data-flow grafiği kurarım:
Debugger’da send API’sinin buffer pointer ve length argümanları kaydedilir. Buffer’ın memory write cross-reference’leri geriye izlenir. Her alanın builder’a eklendiği basic block bulunur. Decode edilmiş alan ile packet body byte-for-byte karşılaştırılır. Eğer encoded output değişiyorsa IV/nonce, victim-specific key veya random seed aranır.
Amadey’in başka sürümlerinde custom string encoding ve Base64 katmanları raporlanmıştır. SonicWall’ın 3.83 analizi API, C2 ve registry stringlerinin
.rdata içinde encoded tutulduğunu belgeliyor. Fakat algoritma/build farkı nedeniyle bu sonucu geriye dönük biçimde bu 2021 sample’a atamak yerine, output alphabet, padding, decoded length ve decode routine’i sample üzerinde bulunmalıdır.
Aşama X — Windows Açısından Bütün Olayı Tek Timeline’da Görmek
35. Process Monitor Timeline
Bir malware raporunun en güçlü sayfası bazen decompiler ekranı değil, ilk birkaç saniyenin iyi normalize edilmiş zaman çizgisidir. Process, file, registry ve network olayları aynı saat tabanında birleştiğinde davranışın sebep-sonuç ilişkisi görünür hale gelir. Bu sample için yayımlanmış rapor raw.PML, .PCAP veya event timestamp’lerini paylaşmadığı için milisaniye değerleri uydurmak doğru olmaz. Aşağıdaki sıralama, laboratuvarda ölçülmesi gereken capture şemasıdır; Δ değerleri gerçek Procmon kaydından doldurulur:
- Boot/background gürültüsü process name ve PID filtreleriyle ayrılır.
- İlk sample PID’sinden descendant ve erişilen target PID’ler çıkarılır.
Time of Dayyanında process start’a göre relative timestamp hesaplanır.- Aynı handle/path üzerinde ardışık query event’leri tek mantıksal operasyon altında gruplanır.
NAME NOT FOUNDprobe’ları ile başarılı create/write ayrılır.- Network event’leri pcap timestamp’leriyle, process event’leri Sysmon
ProcessGuidile bağlanır. - Her yüksek seviye iddia en az bir event satırı ve mümkünse call stack ile desteklenir.
36. Sysmon / Windows Event Log Perspektifi
Procmon analyst workstation aracıdır; Sysmon ise doğru yapılandırıldığında olayları kalıcı Windows Event Log kayıtlarına dönüştürür. Microsoft’un Sysmon dokümantasyonu, process creation event’inin command line, hash ve domain genelinde korelasyona elverişliProcessGuid taşıdığını belirtir.
Event 3 ve Event 7 gibi gürültülü olaylar her yapılandırmada açık değildir; özellikle ImageLoad tüm modülleri kaydettiği için filtrelenmezse yüksek hacim üretir. “Logda yok” sonucundan önce ilgili event türünün capture sırasında etkin olduğu doğrulanmalıdır.
Native Windows logları da bağlam sağlar:
- Security Event 4688, Audit Process Creation etkinse yeni process ve isteğe bağlı command line bilgisi verir.
- Task Scheduler Operational logu task registration, action start ve completion akışını gösterebilir.
- Defender Operational logu sample detection/quarantine veya policy değişikliklerini gösterebilir.
- System logu service creation/start ve sürücü olaylarını destekleyebilir.
ProcessGuid, process start time, image hash ve parent identity birlikte tutulduğunda daha güvenilir bir execution graph çıkar.
37. ETW — Windows’un Kendi Telemetrisi Bize Ne Söylüyor?
Event Tracing for Windows, user-mode ve kernel-mode provider’ların event üretmesini; controller’ın session açıp provider’ları etkinleştirmesini; consumer’ın event’leri gerçek zamanlı veya.etl dosyasından okumasını sağlayan altyapıdır. Microsoft, ETW’yi verimli bir kernel-level tracing facility olarak tanımlar.
Malware analizi için yararlı event sınıfları:
System Providers içindeki System Process Provider process lifetime, image load ve thread event’leri sunar. Windows Performance Recorder (WPR) bu event’leri profil tabanlı kaydedebilir; Windows Performance Analyzer (WPA)
.etl içinden grafik ve tablolar üretir.
ETW’nin avantajı yüksek çözünürlüktür; dezavantajı da aynı nedenle event hacmidir. Buffer boyutu/yazma hızı yetersizse event kaybı oluşabilir. Capture raporunda session profili, enabled provider/keyword’ler, clock type, lost event sayısı ve zaman senkronizasyonu yazılmalıdır. Aksi halde eksik trace, yanlış “olmadı” sonucuna dönüşebilir.
Bu sample’da ETW özellikle üç belirsizliği çözmeye yarar:
taskeng.exeile ilişkinin normal process launch mı, handle access mi, thread/context değişikliği mi olduğu,- Unpacked kodun hangi thread ve memory region’da yürüdüğü,
- C2 bağlantısının hangi PID/TID ve hangi image/private code bağlamından başlatıldığı.
Aşama XI — Statik ve Dinamik Analizi Birleştirmek
38. Ghidra/IDA’daki Kod ile Procmon’daki Davranışı Eşleştirmek
İyi analiz “decompiler’da bu API var” veya “Procmon’da bu dosya var” demekle bitmez. Aynı olay iki taraftan bağlanır:
Örneğin decompiler
CreateFileW(path, ...) gösteriyorsa path değişkeni tek başına yetmez. Runtime’da pointer’ın gerçek Unicode içeriği, file creation disposition, dönen handle, ardından o handle’a yapılan write’lar ve final file hash’i kaydedilir. Böylece “dosya açmaya çalıştı” ile “payload bıraktı” ayrılır.
Call site’i etiketlerken yalnızca API adı değil semantik rol yazılır: CreateFileW_drop_self_copy, WriteFile_post_buffer, VirtualAlloc_unpack_region gibi. Bu isimler kanıt güçlendikçe güncellenmelidir; ilk bakışta unpack_region denilen buffer daha sonra screenshot buffer çıkabilir.
39. x32dbg ile Runtime Davranışın Doğrulanması
Örnek PE32 olduğu için x32dbg kullanılmalı ve x86 calling convention dikkate alınmalıdır. API entry’sinde return address[ESP], ilk stdcall argument’i [ESP+4] konumundadır. Fonksiyon dönüşünde EAX, boolean/handle/pointer gibi sonucu taşır.
Modern Windows’ta export forwarding nedeniyle breakpoint’in
kernel32 isminden KernelBase implementation’ına çözülmesi normaldir. Dynamic API resolution varsa import breakpoint’leri kaçabilir; bu durumda ntdll Native API sınırları ve memory execution breakpoint’leri ek görünürlük sağlar.
Her hit için şu minimal log formatı yeterince güçlüdür:
- Gözlem koşusu: Debugger yok; Procmon, Sysmon/ETW ve pcap açık.
- Kontrollü debug koşusu: API/OEP breakpoint’leri açık; aynı FakeNet yanıt profili kullanılır.
40. Unpacking — Diskteki Malware ile RAM’deki Malware Aynı mı?
Çoğu zaman aynı değildir. Diskteki sample packer stub ve encoded payload taşırken, RAM’de decoder’ın ürettiği daha büyük, farklı section/region düzenine ve yeniden kurulmuş API pointer’larına sahip kod bulunabilir. Pratik unpacking akışı:- Orijinal sample hash’leri ve PE metadata’sı kaydedilir.
- Entry point/TLS callback’lerden başlanarak write edilen memory region’lar izlenir.
VirtualAlloc/VirtualProtectsonucu oluşanMEM_PRIVATEexecutable alanlar işaretlenir.- Stub’dan yeni region’a direct/indirect jump, return veya exception transferi aranır.
- Yeni region’da normal fonksiyon prologue’ları, control-flow yoğunluğu, string/API kullanımı ve stabil execution doğrulanır.
- Process o noktada durdurulur ve ilgili image/region dump edilir.
- Runtime image base ve gerçek OEP dump metadata’sına uygulanır.
- Resolved API address’lerinden import table/IAT Scylla benzeri bir araçla yeniden kurulur.
- Dump yeniden açılır; section mapping, imports, strings ve decompiler sonucu kontrol edilir.
- Orijinal dosya ile dump ayrı hash’lenir; dump’ın analist tarafından üretilmiş artefact olduğu raporda belirtilir.
- Execution packer image’ın küçük stub’ından daha geniş bir code bölgesine taşınır.
- Bölge daha önce yazılmıştır ve artık executable’dır.
- API çağrıları/manuel resolver sonrası gerçek işlevler görünür.
- Control flow birkaç basic block’tan ibaret değildir; normal fonksiyon ağı oluşur.
- Stringler ve configuration artefact’ları plaintext veya çözülebilir hale gelir.
- İkinci çalıştırmada aynı module-relative geçiş yeniden üretilebilir.
Unpacked.exe adlı yeni bir EXE üretildiğini ve ana EXE ile aynı olduğunun düşünüldüğünü söylüyor. Bu ad dosyanın gerçekten unpacked olduğuna tek başına kanıt değildir. Original, Unpacked.exe, drbux.exe ve memory dump için size/hash/PE structure karşılaştırması yapılmalıdır. İsim, analistin veya sample’ın etiketi olabilir; içerik doğrulamayı hash ve yapı analizi yapar.
Sonuç — “Çalıştı” Dediğimiz Şey Bir Olay Değil, Bir Zincir
Bir.exe dosyasına çift tıkladığımızda ilk gerçekleşen şey malware davranışı değildir. Önce Shell isteği çözer, Win32 process creation katmanı çalışır, Native API kernel’e geçer, EPROCESS/ETHREAD ve güvenlik bağlamı kurulur, executable image sanal adres alanına map edilir, imports ve relocations çözülür, TLS callback’leri çalışabilir ve CPU entry point’e ulaşır. Packed örnekte entry point bile gerçek payload değil, onu RAM’de kuran stub’dır.
Amadey örneği bu zincirin üzerine kendi izlerini bırakıyor: packed ve obfuscated PE, ek şifreli section’lar, anti-debug API’leri, Temp altında drbux.exe self-copy’si, numeric bir binary dosya, taskeng.exe bağlamı hakkında araştırılması gereken bir iddia ve WinINet üzerinden iki tarihsel C2 hedefine POST girişimi.
En önemli sonuç ise teknik bir API adı değil, kanıt disiplini:
- Import, niyet/kapasite ipucudur; gerçekleşmiş davranış değildir.
- String, artefact’tır; network veya registry olayı değildir.
- Self-copy, tek başına persistence değildir.
- Bir host process adı, tek başına injection tekniğini söylemez.
- Family behavior, aynı ailedeki her hash için sample evidence değildir.
- Raw timeline ve exact disassembly yoksa milisaniye veya instruction uydurulmaz.