Non so su Zeus in particolare, ma in generale, è facile farlo utilizzando le API di debug come VirtualProtectEx
e WriteProcessMemory
. Aprire un HANDLE al processo di destinazione, aggiungere un po 'di memoria eseguibile (con VirtualAllocEx
), inserire del codice malizioso, re-mappare l'indirizzo virtuale del codice eseguibile della libreria che contiene l'API di destinazione come RWX, sovrascrivere i primi byte della funzione che si desidera agganciare con un'istruzione di salto che va al tuo codice dannoso iniettato e controlli tutto ciò che fa la funzione.
Ci sono molti altri modi per ottenere risultati simili; l'uso delle API di debug e la sovrascrittura dei punti di ingresso di funzioni reali è solo un esempio che ho visto nel mondo reale. Il programma dannoso può eseguire questa operazione ogni volta che il debuggee (vittima) carica una nuova libreria, inclusi tutti quelli caricati durante l'inizializzazione del processo, prima dell'esecuzione anche della main()
della vittima.
Iniezione DLL (che può eseguire il hooking all'interno del processo, senza bisogno di fare nulla di inter-process) e shim di compatibilità (come sono usati per eseguire programmi in "modalità compatibilità" per versioni del sistema operativo precedenti e sostituire il sistema API con codice diverso) sono altre due utili opzioni.