Giriş
“Process Hallowing” və ya “RunPE” uzun zamandır zərərvericilər tərəfindən istifadə edilən, zərərvericinin özünü gizlətmək üçün başqa proses adından (əksər hallarda əs legitim proqram təminatları hədəf olaraq seçilir) işə salınması metoduna verilən addır. Sözü gedən metod ilə zərərvericinin əsas məqsədi özünü antiviruslar-dan (və ya istifadəçidən), həmçinin firewall kimi proqram təminatlarından gizlətməkdir. Zərərverici, zərərli kodları işə salmaq üçün hədəf olaraq seçdiyi proqram təminatını dondurulmuş rejimdə işə salır (calc.exe) və ona aid icra edilə bilən kodlarının olduğunu yaddaş bölgəsini boşaldaraq bu əraziyə zərərli kodları köçürür. Bəzi sazlamaları etdikdən sonra isə zərərli kodların olduğu “legitim” proses qaldığı yerdən fəaliyyətinə davam edir. Ətraflı məlumat üçün sizlər üçün hazırladığımız aşağıdakı məqalələri oxumağınızı məsləhət görürük.
https://mrl.cert.gov.az/az/articles/view/98
https://mrl.cert.gov.az/az/articles/view/94
Bu məqalənin əsas mövzusu legitim proses içərisindən sözü gedən metod ilə işə salınan zərərverici kodları aşkar etməkdir. Bunun üçün proses yaddaşı və PE fayl formatı ilə yaxından işləyəcəyik. İlk öncə testlərimizi aparacağımız test proqramımızı hazır edirik.
Testapp.asm
Test proqramını hazır etdikdən sonra icra edilə bilən faylın formatına göz gəzdirək. Not: Məqalədə PE fayl fomatına tam baxış (təhlil) nəzərdə tutulmayıb. İstinadlar bölməsindən ətraflı məlumatları əldə edə bilərsiniz. Aşkarlanma qisminə keçməzdən öncə hazırladığımız test proqramının ümumi strukturuna baxaq.
Test proqramında qarşımıza ilk olaraq DOS (IMAGE_DOS_HEADER) ( +DosStub) header adı verilən hissə çıxır.
Yuxarıda göstərilən struktur içərisində sonuncu LONG tipində e_lfanew dəyəri (offset) bizi PE içərisində növbəti vacib hissəyə aparır. PE fayl başlığı.
Signature içərisində PE fayl imzası saxlanılır. Defolt olaraq bu dəyər PE fayl üçün 0x4450 (0000) (PE)-dir.
PE imzasından sonra IMAGE_FILE_HEADER strukturu gəlir. Burada hədəf arxitektura, icra edilə bilən faylın nə qədər bölmədən ibarət olduğu, fayl xarakteristikası, yaradılma tarixi və s. kimi məlumatlar saxlanılır.
Ardınca IMAGE_OPTIONAL_HEADER adı verilən hissə (başlıq) gəlir.
Bu başlıq fayl checksum dəyəri, proqramın (thread) hardan başlayacağı haqqında məlumat, yaddaş bölgəsində hizalanma (alignment) dəyəri, icra edilə bilən faylın arxitekturası (32/64) və s. kimi məlumatları özündə ehtiva edir. Struktur sonunda 16 ədad massivdən ibarət başqa bir vacib struktur IMAGE_DATA_DIRECTORY saxlanılır.
Bu struktur içərisində icra edilə bilən faylın fəaliyyət göstərməsi üçün lazım olan tablolar haqqında kritik məlumatlar (qovluq offseti və ölçüsü) saxlanılır. Misal import, export, resurs qovluğu. Optinal header-dən həmən sonra icra edilə bilən fayla aid əsas məlumatların (kodlar, resurslar, import edilən kitabxanalar haqqında məlumatlar, export edilən funksiyalar, fəaliyyət zamanı istifadə ediləcək mətnlər və s.) saxlanıldığı bölmələr (PE sections) gəlir. Sözü gedən bölmələr IMAGE_SECTION_HEADER strukturu ilə təsvir edilir.
Burada misal olaraq .text bölməsində yazdığımız kodlar,
.data bölməsində proqram içərisində istifadə etdiyimiz məlumatlar (initialized),
.idata bölməsində isə istifadə etdiyimiz kitabxana və onlara aid funksiyaların yer aldığını görə bilərsiniz.
Müqayisə və aşkar etmə
“Process hallowing və ya RunPE” metodu ilə işə salınan zərərverici kodları aşkar etmək üçün icra edilən bilən fayl (disk üzərində saxlanılan) məlumatları ilə fəaliyyət göstərən prosesin PE məlumatlarını (yaddaş üzərində saxlanılan) müqayisə etmək lazımdır. Bununla da aradakı fərqlər üzərindən, prosesin icra etdiyi kodların orijinal icra edilə bilən fayla aid olub-olmadığını təyin etmək mümkündür. 100 dəfə eşitməkdənsə, 1 dəfə görmək yaxşıdır!
Testapp proqramını işə salaraq proses yaddaşına nəzər salaq. Proqramı işə salarkən Windows və ya PE loader sözü gedən proqramı (disk üzərində saxlanılan PE faylı) oxuyaraq xəritələmə adı verilən əməliyyatı icra edir. PE formatını təhlil edir və uyğun şəkildə yaddaş ərazisinə xəritələyir (lazım olan dəyişikliklər ilə birlikdə).
ƏS sözü gedən proqramı 0x400000 adresindən başlayaraq xəritələyib. Yuxarıda göstərilən ərazilərə baxaq.
0x400000 adresində IMAGE_DOS_HEADER,
0x401000 adresində isə .text bölməsinin xəritələndiyini görürük.
Oxşar şəkildə 0x402000 adresində isə .data bölməsi.
PE başlıqlarına Windbg aləti ilə baxaq.
Debug alətin əldə edilən dəyərlər ilə disk üzərində mövcud olan fayl dəyərləri –ni qarşılaşdırsanız 99%-lik bir oxşarlığın olduğuna şahid ola bilərsiniz. Əgər zərərverici, zərərli kodları hər hansı bir legitim proses adından icra edirsə bu zaman sözü gedən oxşarlıq (lar) aradan qalxır. Nümunə üçün test proqramını Windows legitim aləti olan calc.exe içərisindən işə salaq. RunPE üçün https://github.com/joren485/HollowProcess alətindən istifadə edilmişdir.
Şəkildə gördüyünüz kimi sistemdə fəaliyyət göstərən proses calc.exe legitim olaraq görünür. Lakin icra edilən kodlar tamamı ilə fərqlidir. Bunu aşkar etmək üçün sözü gedən prosesə aid modulların siyahısını ekrana yazdıran kiçik bir proqram yazaq.
Nəticə:
Hər şey qaydasında kimi görsənir. Prosesin yükləndiyi adresə Windbg ilə baxaq. !dh əmri ilə yuxarıda göstərilən adresdə mövcud olan PE başlıqlarını analiz edək və ilk müqayisəni IMAGE_FILE_HEADER içərisində saxlanılan TimeDateStamp üzərindən edək. Yaddaş ərazisində olan TimeDateStamp dəyəri:
Legitim calc.exe TimeDateStamp dəyəri:
Növbəti müqayisə-ni DataDirectory (IMAGE_DATA_DIRECTORY) üzərində edirik.
Proses IMAGE_DATA_DIRECTORY (16 ədad massiv):
calc.exe:
Disk üzərində olan PE məlumat qovluqları ilə yaddaş ərazisində olan qovluqlar arasında fərq olduqca çoxdur. Səbəbi yaddaş ərazisində olan PE-nin legitim calc.exe deyil bizim “zərərvericimiz” testapp.exe olmasıdır. Son olaraq icra ediləcək kodların olduğu bölməyə (.text) nəzər salaq.
Burada əsas kodlar bizim testapp ilə eynidir. Lakin calc.exe .text bölməsində olan kodlar tamamı ilə fərqlidir.
Aşkarlama prosesinin avtomatlaşdırılması
Artıq müqayisəni necə edəcəyimizi bildiyimizə görə prosesi avtomatlaşdıra bilərik. İlk olaraq prosesin yükləndiyi adresi aşağıdakı funksiyanın köməkliyi ilə öyrənirik.
Prosesin xəritələndiyi adresi öyrəndikdən sonra disk üzərindəki fayl (calc.exe) başlıqlarını oxuyuruq.
Daha sonra müqayisə əməliyyatı üçün yaddaş ərazisində saxlanılan PE (testapp.exe) başlıqlarını oxuyuruq.
Başlıqları oxuduqdan sonra aşağıdakı funkiyanın köməkliyi ilə NT başlıqlarını müqayisə edirik.
Əlbətdə yalnız bu məlumatlardan yola çıxaraq proses yaddaşına müdaxilə edilib-edilmədiyinə qərar vermək o qədər uğurlu nəticələr verməyə bilər. Dəqiqliyə yaxın nəticə əldə etmək üçün PE başlıqlarının, bölmələrinin müqayisəsi labüddür.
Not: Proqramlar normal fəaliyyətləri zamanı real vaxt rejimində öz dəyişənlərində, kodlarında dəyişikliklər edə bilər. Bu baxımdan bölmələri bayt bayt qarşılaşdırma məqsədə uyğun deyil. İdeal aşkarlama üçün ssdeep kimi məlumatları hissələrə bölüb onların xeş dəyərləri üzərindən müqayisə edən alqoritmların (fuzzy hash) istifadəsi məsləhətdir.
İstinadlar
[1] https://www.microsoft.com/en-us/security/blog/2021/07/27/combing-through-the-fuzz-using-fuzzy-hashing-and-deep-learning-to-counter-malware-detection-evasion-techniques/
[2] https://www.adlice.com/runpe-hide-code-behind-legit-process/
[3] https://learn.microsoft.com/en-us/windows/win32/debug/pe-format