TlHelp32 icra oluna bilən proqram təminatları haqqında informasiya əldə edilməsi üçün istifadə edilən funksiyalardan ibarət kitabxanadır. Bu kitabxana köməkliyi ilə sistemdə fəaliyyət göstərən proseslər, onları istifadə etdikləri modullar (dll), aktiv heap yaddaşları, icra olunan threadlar vs haqqında məlumat əldə etmək mümkündür. Daha ətraflı məlumat üçün : https://docs.microsoft.com/en-us/windows/win32/api/_toolhelp. Məqalədə göstərilən metod “proof of concept” olaraq qəbul edilməlidir. Müdaxilə edilən prosesin düzgüz işləyib işləməyəcəyi haqqında tam olaraq test fəaliyyəti həyata keçirilməmişdir. Məqalənin 1. qismində sizlərə TlHelp32 kitabxanasından yayınaraq yüklənilən modulun necə gizlədiləcəyi haqqında məlumat vermişdim. Bu yazıda isə sizlərə icra edilən prosesin imagepathın -da ediləcək dəyişiklik ilə antivirus (ClamAV) proqram təminatından necə yayınmaq olar bu haqda bəhs edəcəyəm. Ilk öncə bizə bypass edəcəyimiz antivirus haqqında bəzi məlumatlar lazımdır. ClamAV memory scan opsiyası ilə proseslər və onlara aid modulların axtarışını həyata keçirir. Virtual maşında olmadığım üçün məcbur özüm test sample yaradıb onun hash summası ilə şəxsi signature baza yaradıb məhz bu faylın axtarışını edəcəyəm.
testapp.c
#include
#include
int main(void)
{
printf("Current Process ID %d\n",
GetCurrentProcessId());
getchar();
}
Daha sonra en yeni clamav mühərriki ilə testapp prosesi üzərində axtarış edəcəyəm. Lakin ilk öncə imza bazası yaratmalıyıq. ClamAV istifadəçilərə öz şəxsi bazalarını yaratmaq imkanı tanıyır. Bunun üçün sigtool alətindən istifadə edirəm.
Gördüyünüz kimi testapp faylımızı virus olaraq görür. Eyni əməliyyatı testapp.exe-ni işə salıb yoxlayaq.
Memory scan əməliyyatıda faylı uğurla aşkar etdi. ClamAV mühərrikin scan əmliyyatlarında hansı funksiyalardan istifadə etdiyini görmək üçün clamscan.exe nə static analiz etmək lazımdır. IDAPro ilə disasm etdim və ClamAV-də eyni part1 -də olduğu kimi modulların siyahısını götürür və scan əməliyyatı modulların pathı üzərindən həyata keçirilir. ClamAV bunun üçün ToolHelp32 kitabxanasının CreateToolhelp32Snapshot funksiyasından istifadə edir.
HANDLE CreateToolhelp32Snapshot(
[in] unsigned long dwFlags,
[in] unsigned long th32ProcessID
);
Burada clamscan flag olaraq 2 (TH32CS_SNAPPROCESS) və PID 0 parametrləri ilə CreateToolhelp32Snapshot funksiyasını çağırır. PID 0 sistemdə olan bütün proseslərin siyahısını götürür. Daha sonra Proces32 funksiyalarının köməkliyi ilə bu prosesləri enum edir.
Burada PROCESSENTRY32W strukturundan th32ProcessId-ni götürüb yenidən CreateToolhelp32Snapshot funksiyasını bu PID dəyəri əsasında yenidən çağırır.
Bu dəfə isə flag olaraq 0x18 (TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32) parametrini CreateToolhelp32Snapshot funksiyasına göndərir.
Bundan sonra isə fayl path üzərində axtarış əməliyyatı aparır. Biz isə yenidən PEB (ProcessEnvironmentBlock) struktuna müraciət etməliyik. Burada clamav Module32 funksiyalarından istifadə etdiyi üçün ilk olaraq əlbətdə PEB_LDR_DATA strukturuna baxmalıyıq. Bizə lazım olan field FullDllName dir.
Burada diqqət çəkən bir məqam var. Bu field cari load edilən modulun full pathına işarə (memory pointer) edir. Buffer fieldinə baxdığım zaman adres qismi olduqca maraqlı gəldi.
Bu adres həmçinin bir başqa data strukturunda da qeyd edilib.
PEB - RTL_USER_PROCESS_PARAMETERS:
Gördüyünüz kimi hər 2 bufferdə eyni adresi göstərir. Bu adreslərin birində edilən dəyişiklik digər buferədə təsir edəcəkdir. Buna görə LDR_DATA_TABLE_ENTRY strukuturunda deyil birbaşa RTL_USER_PROCESS_PARAMETR strukturu üzərindən prosesə müdaxilə edəcəyəm. Burada ImagePathName üzərində edəcəyim dəyişiklik ilə ClamAV module list zamanı prosesin full pathını görməyəckdir. Daha dogrusu ImagePathName -i legitim bir fayl pathı ilə dəyişib ClamAV -nın başqa (legitim) faylı scan etməsini test edəcəyəm. İlk olaraq bizə legitim bir program təminatı lazımdır. Bünün üşün kiçik bir proqram təminatı yazdım və testtpp.exe olaraq testapp.exe-in olduğu qovluğa yazıram və ImagePathName bufferində olan yolu bu legitim fayl yolu ilə dəyişirəm.
Faylın hash summası isə tamami ilə fərqlidir.
clamscan --memory əmri ilə sistemdə fəaliyyət göstərən prosesləri scan etdim.
Gördüyünüz kimi əslində testapp.exe - ni scan etmək istəyən clamscan, etdiyim dəyişiklik ilə başqa legitim fayl üzərində axtarış əməliyyatı həyata keçirir və mühərrik tərəfindən təhlükəli fayl olaraq aşkar edilmir.
İstinadlar
[1] https://docs.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb
[2] https://www.geoffchappell.com/studies/windows/km/ntoskrnl/inc/api/ntldr/ldr_data_table_entry.htm