|
|
|
![]() |
|
Strumenti |
![]() |
#21 | ||||||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
leggiti bene il doc di Microsoft sul formato PE ![]() Quote:
qui sotto ti ho messo il codice del mio virus, che fa esattamente questa cosa; occhio però che ha un problema (quasi) noto che devo ancora risolvere ![]() mi funziona perfettamente se lo metto in un paio di processi, ma provoca schermata blu ( ![]() Codice:
<il codice è stato tempestivamente rimosso> ![]() avevo anche scritto un piccolo txt contenente la descrizione delle caratteristiche e delle tecniche usate nel virus, che ti copio di seguito (ce n'è una che non ho ancora applicato: l'invisibilità nel call stack). Quote:
Quote:
Quote:
![]() ![]() ![]() comunque se hai paura che nel tuo processo originale CreateRemoteThread sia stata intercetta, semplicemente anche lì fai un controllo su tutte le funzioni API che importi per vedere se hanno dei JMP (e casomai controlla anche l'integrità della IAT ![]() Quote:
![]() Ultima modifica di 71104 : 07-10-2005 alle 18:19. |
||||||
![]() |
![]() |
![]() |
#22 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
ehm, piccolo problema
![]() il txt si vede male perché HardwareUpgrade non fa il wordwrap automatico... ![]() edit: sistemato ![]() |
![]() |
![]() |
![]() |
#23 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
71104: potresti rimuovere il codice del virus... Capisco che sia interessante, ma altra gente potrebbe sfruttarlo... |
|
![]() |
![]() |
![]() |
#24 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() ![]() ![]() Quote:
![]() è proprio necessario? tanto non funziona, e probabilmente sono l'unico essere della terra in grado di correggere il problema in mezzo a quel "Coding Horror"... ![]() |
||
![]() |
![]() |
![]() |
#25 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Magari invialo in PVT a GordonFreeman... |
|
![]() |
![]() |
![]() |
#26 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#27 | |||||
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
Quote:
![]() Quote:
Quote:
![]() ![]() Quote:
un'ultima cosa: se faccio il file mapping ho una mappatura DEL FILE,ma come sai l'immagine in memoria di una dll non è identica al file,perchè la dimensione di allineamento delle sezioni del file è diversa dall'allineamento di sezioni in memoria,di solito è minore nel file,ad esempio in kernel32.dll le sezioni sono allineate a 0x400 bytes,e in memoria a 0x1000 bytes...e gli RVA si riferiscono all' "indirizzo relativo all'inizio del MODULO IN MEMORIA", e quindi non è un offset all'interno del file ecco,allora fai conto che la funzione DllEntryPoint() che tu chiami nel file mapping object si riferisca a una variabile in ".idata"...il processo crasherà perchè l'indirizzo che DllEntryPoint ha usato è un RVA, che non corrisponde all'offset della variabile DENTRO IL FILE...spero di aver esposto bene il problema.... per quello ho allocato memoria allineando correttamente le sezioni e poi riempiendole e lasciando inalterati i byte di padding (di allineamento della sezione).... mamma mia che casino ![]() Ultima modifica di GordonFreeman : 07-10-2005 alle 22:39. |
|||||
![]() |
![]() |
![]() |
#28 | ||||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
stiamo dicendo cose diverse O_o' dunque: io (che chissa perché quando leggo su HWU capisco sempre male, sarà che leggo di fretta... O_o') avevo capito che tu per ogni sezione chiamavi VirtualAlloc, o cmq che la chiamavi più volte; da quest'ultimo post invece mi sembra che la chiami una volta sola per allocare TUTTO, e in tal caso non c'è NESSUNISSIMO problema, se non quello che devi stare attento a calcolare la reale dimensione dell'immagine PE una volta caricata in memoria. Quote:
1) il mio bel loader invisibile carica la mia DLL in modalità invisibile, ma usa anche la normale LoadLibraryA per caricare tutti i moduli da cui dipende 2) non ho mai provato ad entrare in processi del sistema operativo (cioè in processi avviati da SYSTEM), ho provato solo con notepad, mspaint, explorer, e cazzate simili. il problema è un problema di istanze e di protezione Copy-On-Write (come ti dicevo, il problema è (quasi) noto ![]() Quote:
![]() se hai i permessi di esecuzione hai anche quelli di lettura e viceversa, vai tranquillo ![]() Quote:
![]() ![]() dopodiché un bel giorno di punto in bianco il virus mi inizia a crashare senza motivo e analizzandolo col PEView scopro che gli RVA sono *COMPLETAMENTE DIVERSI* dagli offset... :| ed era il compilatore Intel ![]() quindi ho continuato ad usare sempre la tecnica dei file mapping, ma in maniera un po' diversa: premesso che non mi fido del flag SEC_IMAGE che si può passare alla CreateFileMapping, io procedo come segue: 1) leggo gli headers direttamente dal file e calcolo la dimensione complessiva dell'immagine virtuale una volta caricata in memoria 2) creo un file mapping object nel file di paging con la dimensione calcolata 3) ci ricopio manualmente gli headers e le sezioni 4) riloco e bindo ![]() in pratica potrei anche usare il semplice VirtualAlloc, vero, ma col file mapping object risparmio memoria ![]() Ultima modifica di 71104 : 07-10-2005 alle 23:17. |
||||
![]() |
![]() |
![]() |
#29 |
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
ok dai allora il casino che avevo è il rilocamento,speriamo che facendolo possa avere delle API trusted funzionanti
![]() per ora provo un normale virtualalloc e poi le ottimizzazioni vengono alla fine ma è vero che non si può creare thread remoti nel processo SYSTEM e alcune applicazioni native? e un'ultima domanda,considera questo dump di NtCreateFile() NtCreateFile: mov eax, 0x0000001A lea edx, [esp+04] int 0x2E ret 0x2C se io , per chiamare la funzione originale , semplicemente eseguissi quelle istruzioni invece di chiamare la funzione?? fantoibed all'inizio mi ha detto che non funziona,che non è la stessa cosa...ma allora non lo sarebbe nemmeno il chiamare le api trusted che carichiamo a mano tu e io... spiegami cosa intendeva |
![]() |
![]() |
![]() |
#30 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
![]() secondo me funziona... |
||
![]() |
![]() |
![]() |
#31 | |
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
vabbeh...tutto questo lo devo fare per la tesi di laurea...solo a me potevano dare una mazzata del genere da fare , che sfiga ![]() consideriamo un'altra cosa: se il rootkit è furbo non chiama ntcreatefile,ma per usare un file esegue lo stub direttamente,quindi io anti-rootkit illuso non lo beccherò mai,non saprò mai che usa i file nascosti...da qui la necessità di scrivere un filter driver che catturi gli IORP e che lo becchi per forza,da lì non scappa...heheh ma tanto i rootkit modo utente con cui devo avere a che fare sono NtIllusion e pochi altri rootkit modo utente poco furbi,che non lo fanno ma chiamano la funzione... cioè mi è stato assegnato di fare tutto ciò che è possibile in modo utente...ed è questo secondo me ![]() |
|
![]() |
![]() |
![]() |
#32 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() ![]() comunque penso di no, più di così non puoi fare: se il rootkit chiama direttamente int 2E senza passare per gli stub di ntdll.dll amen... |
|
![]() |
![]() |
![]() |
#33 | |
Member
Iscritto dal: Apr 2005
Messaggi: 296
|
Quote:
allora,considera la funzione NtQuerySystemInformation , con il parametro SystemHandleInformation...ecco io nell'anti-rootkit posso ottenere tutti gli handle del sistema , duplicarli per il mio processo , e usare NtQueryObject() , come ho detto in questo post http://www.hwupgrade.it/forum/showthread.php?t=1031131 allora,lì c'è il problema delle pipe che non posso interrogarle per sapere il loro nome se no il mio thread si blocca e bisogna riavviare il sistema fisicamente,col tasto per resettare ![]() quindi direi che invece che usare NtQueryObject() posso usare questa funzione presente in un MSDN Example, che si chiama GetFilenameFromHandle() http://msdn.microsoft.com/library/de...ile_handle.asp bene ,quest'approccio implica non usare l'altro,che sarebbe inutile a questo punto heheh,cioè si può fare tutto in locale,non serve fare dll injection ora i problemi sono 2: 1. siamo sicuri che CreateFileMapping() non si blocchi sulle pipe?? spero che ritorni solo un errore 2. per usare un CreateFileMapping() trusted,forse combino a caricare un ntdll a mano e chiamare NtCreateSection() , ma per GetMappedFileName() come farei?? questo è un po' un casino,perchè io non so quali funzioni di ntdll esso chiama e più o meno com'è implementata...allora direi di fare una furbata: - sospendo tutti i processi forchè il mio chiamando NtSuspendProcess() che è disponibile da windows xp - chiamo NtCreateProcess() dalla mia dll trusted e creo un "processino" che faccia questo lavoro,senza alcun pericolo di hooking perchè nessuno può aver intercettato la chiamata,e poi se ipotizziamo un thread nel processo rootkit che periodicamente chiama NtQuerySystemInformation per ottenere i processi sul sistema...beh non può vederlo perchè il rootkit viene sospeso ![]() - chiamo NtResumeProcess() per far ripartire tutti i processi hihihih ma tutto questo và fatto periodicamente,e spero che non rallenti vistosamente il sistema...ma chissenefrega,sicuramente sarà + veloce di zonealarm ![]() poi c'è un pericolo che il rootkit metta questo thread "demone" in tutti i processi,anche nel mio,ma anche lì posso controllare i miei thread e vedere se ce n'è qualcuno che so di non aver creato io ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:02.