Ultima modifica da un moderatore:
Già tempo fa feci un crackme in vb6 che sfrutta la tecnica che ora vado a farvi vedere.
In pratica si tratta di eseguire un programma direttamente in memoria, partendo da un array di byte.
I piu' svegli già a questo punto staranno pensando ad utilizzare tale tecnica come protezione, autoupdate ecc ecc
Quasi inutile esporre i vantaggi... per esempio possiamo avere un file crittografato che leggiamo in memoria, decriptiamo ed eseguiamo. Tutto in ram senza lasciare una minima traccia sul disco. Oppure leggere un file direttamente da una risorsa incorporata ecc.
Pensate che è possibile runnare addirittura eseguibili non fatti in DotNet. E se questi hanno una imagebase diversa dal file orignale, non sarà neppure possibile attaccarsi al processo.
Bhe passiamo ai fatti,
vi allego un esempio con tanto di sorgente, nel quale il programma:"exe a runtime.exe",
leggera' un eseguibile di esempio: "pippo.exe" (tra l'altro fatto in vb6)
poi andra' a sostituire se' stesso riscrivendo la memoria con il contenuto di pippo.exe
ed eseguirà il tutto.
Vedrete che il file pippo.exe nonostante sia in esecuzione puo' essere anche cancellato perchè sta vivendo dentro "exe a runtime.exe"
come detto in precedenza l'eseguibile a runtime puo' essere ovunque: un file, una risorsa, puo' essre criptato, puo' essere compresso eccc
sarà sufficente passare a RunExe l'array di byte pronto da eseguire e lui farà il resto.
DOWNLOAD SORGENTE
Angolo tecnico:
ma come fa?
detto in due parole, in un modulo dichiarato tutto l'occorrente per analizzare la struttura dal PE
leggo il file da runnare,
verifico le signature PE e MZ
Creo un processo sospeso su s'è stesso
modifico i context,
rimappo l'eseguibile in memoria per fare eventualmente spazio necessario
sistemo address e header
riscrivo il processo
sistemo immagine e context
rilascio il processo figlio
chiudo il processo padre
pertanto se non chiudete il processo padre, potete far runnare piu' di un exe all'interno dello stesso processo
e che la forrrrza sia con voi xD
NB: trattasi di un sorgente C++ tradotto in vb6 e ora portato in vbNet
Predator
In pratica si tratta di eseguire un programma direttamente in memoria, partendo da un array di byte.
I piu' svegli già a questo punto staranno pensando ad utilizzare tale tecnica come protezione, autoupdate ecc ecc
Quasi inutile esporre i vantaggi... per esempio possiamo avere un file crittografato che leggiamo in memoria, decriptiamo ed eseguiamo. Tutto in ram senza lasciare una minima traccia sul disco. Oppure leggere un file direttamente da una risorsa incorporata ecc.
Pensate che è possibile runnare addirittura eseguibili non fatti in DotNet. E se questi hanno una imagebase diversa dal file orignale, non sarà neppure possibile attaccarsi al processo.
Bhe passiamo ai fatti,
vi allego un esempio con tanto di sorgente, nel quale il programma:"exe a runtime.exe",
leggera' un eseguibile di esempio: "pippo.exe" (tra l'altro fatto in vb6)
poi andra' a sostituire se' stesso riscrivendo la memoria con il contenuto di pippo.exe
ed eseguirà il tutto.
Vedrete che il file pippo.exe nonostante sia in esecuzione puo' essere anche cancellato perchè sta vivendo dentro "exe a runtime.exe"
come detto in precedenza l'eseguibile a runtime puo' essere ovunque: un file, una risorsa, puo' essre criptato, puo' essere compresso eccc
sarà sufficente passare a RunExe l'array di byte pronto da eseguire e lui farà il resto.
DOWNLOAD SORGENTE
Angolo tecnico:
ma come fa?
detto in due parole, in un modulo dichiarato tutto l'occorrente per analizzare la struttura dal PE
leggo il file da runnare,
verifico le signature PE e MZ
Creo un processo sospeso su s'è stesso
modifico i context,
rimappo l'eseguibile in memoria per fare eventualmente spazio necessario
sistemo address e header
riscrivo il processo
sistemo immagine e context
rilascio il processo figlio
chiudo il processo padre
pertanto se non chiudete il processo padre, potete far runnare piu' di un exe all'interno dello stesso processo
e che la forrrrza sia con voi xD
NB: trattasi di un sorgente C++ tradotto in vb6 e ora portato in vbNet
Predator