Home | Chi sono | Contattami
 

Progr. lineare

Delphi
  Componenti
 
Database
 
Miei articoli

Windows

Miei articoli


 

Winsock API Hooking in User Mode
 

27 Dicembre 2007 

Nel post precedente riguardante Orbit Downaloder si è visto come il Grabber di Orbit vada a mappare GrabDll.dll nello spazio di memoria dei processi relativi ad applicativi da monitare con l'obiettivo di porre degli Hook sulle principali api Winsock e quindi sniffare il traffico di rete ed in particolare i download. Bene, in questo post andremo ad analizzare un buon applicativo Open Source in Delphi che fa la stessa cosa: AppSniff. L'autore è tale Blad3 che inizialmente aveva pure un suo spazio sul web (www.blad3.ro) ma ormai purtroppo non ve ne è più traccia. L'applicativo consiste in un eseguibile con interfaccia grafica sul quale verranno visualizzate le connessionin corso (e per ognuna di esse i dati) ed una dll che verrà mappata nello spazio di memoria di tutti i processi (o di un solo precesso a scelta) con l'obiettivo di Hookare le Winsock API e quindi intercettare il traffico di rete di un determinato processo (o eventualmente di tutti quanti ma ci focalizzeremo su un singolo processo giusto per rendere più chiare le questioni che altrimenti si andrebbero ad incasinare a causa dell'insana mole di dati che verrebbe catturata). L'applicativo utilizza come Hook Engine l'ottima MadCodeHook di Mathias Rauen (aka Madshi) : il programma è nato appunto tempa fà nell'ambito di uno dei topic del forum relativo a MadCodeHook 

Winsock Example Code

Dico subito che la MadCodeHook è Open Source ma non freeware : in parole povere è a pagamento , le informazioni sulla licenza attualmente in vigore sono reperibili nel topic "Non-commercial MadCodeHook edition dropped" ; in breve

If you install madCodeHook without having a license, the
latest installer will give you a special evaluation version,
which is fully functional, but which only works if you run
a specific evaluation executable file.

Di AppSniff ho sia i sorgenti sia gli eseguibili (.exe del programma principale e .dll): tali eseguibili son stati creati con una versione precedente di MadCodeHook che non richiede licenze particolari o presenza di file specifici per la propria esecuzione, quindi un .exe nudo e crudo che prende e và senza vincoli di alcun tipo. Naturalmente per la compilazione dei sorgenti occorre quella specifica versione della MadCodeHook: non sarebbe un problema visto che ce l'ho salvata ma visto che le condizioni son cambiate e visto che mi son creato in proprio una semplicissima Hook Engine allora stavo pensando di riscrivere i sorgenti con la mia Hook Engine e rendere quindi il progetto AppSniff totalmente Open Source; vabè questi però son discorsi che vedremo prossimamente, per adesso consieriamo quello che abbiamo. AppSniff usa anche alcuni pacchetti di componenti Open Source liberamente scaricabili dal web (e con questo ho detto tutto, tradotto diventa "cercate e downloadate").

Dunque , detto questo facciamo una cosa: vi passo il link all'applicativo (sorgenti e binari)

AppSniff 1.1 (Src + Bin)

apriamo una piccola parentesi tecnica prima di andare ad esaminare una demo di utilizzo di AppSniff: abbiamo i seguenti file

 

  • AppSniff.exe  (programma principale)
  • AppSniffDll.dll  (dll da mappare nello spazio di memoria di un processo per eseguire l'hook sulle winsock nell'ambito del processo in questione)

AppSniffDll.dll setta Hooks sulle seguenti Winsock api

  • dll: ws2_32.dll ; funzione esportata: listen
  • dll: ws2_32.dll ; funzione esportata: gethostbyname
  • dll: ws2_32.dll ; funzione esportata: closesocket
  • dll: ws2_32.dll ; funzione esportata: send
  • dll: ws2_32.dll ; funzione esportata: WSASend
  • dll: ws2_32.dll ; funzione esportata: recv
  • dll: ws2_32.dll ; funzione esportata: WSARecv
  • dll: ws2_32.dll ; funzione esportata: sendto
  • dll: ws2_32.dll ; funzione esportata: recvfrom

Bene, ora passiamo ad un esempio pratico e per l'occasione ho deciso di prendere in esame una pagina di YouTube per avvicinarmi il più possibile al meccanismo di funzionamento di Orbit Downloader: più precisamente considereremo il seguente indirizzo

Compiz Fusion Ubuntu Gutsy 7.10 Cool Effects

Come Browser ho usato il fedele K-Meleon.

Procediamo nel modo seguente:

1) Lanciamo K-Meleon : di default visualizzerà la sua pagina interna di info (quindi nessuna connessione)

2) Lanciamo AppSniff.exe : menù File -> Inject into Process;
nella finestra che si apre,selezionare K-Meleon e click sul pulsante Inject. Bene, a questo punto AppSniffDll.dll è mappata nello spazio di memoria di K-Meleon ed ha settato gli Hook sulle Winsock

3) Digitiamo in K-Meleon l'indirizzo sopra e lanciamo la navigazione: cominceremo a vedere l'aggiunta di voci di connessione nella finestra di AppSniff.exe. Una volta che parte il filmato , possiamo anche stoppare lo sniffing e pure chiudere K-Meleon perchè tanto abbiamo già quello che ci serve.

Di seguito un pò di immagini per rendere meglio l'idea di quello che ci troviamo davanti (per opportunità di spazio ho tagliato in 2 sottoimmagini ridotte la finestra di AppSniff (che altrimenti non ci sarebbe stata qui sul Blog)

 

 Img1: lista connessioni

 

Img2: dettagli connessione selezionata in Img1

Le prime 2 righe di Img2 ci danno le informazioni che ci servono relativamente all'indirizzo del filmato

GET /get_video?video_id=bvnQE1EAEZY HTTP/1.1

Host: chi-v225.chi.youtube.com

L'indirizzo del filmato è quindi:

http://chi-v225.chi.youtube.com/get_video?video_id=bvnQE1EAEZY

FLV (binary data) in fondo ci restituisce anche la tipologia di dato scambiato, in questo caso appunto un file FLV (il formato dei video di YouTube)

Ora facciamo una prova: apriamo K-Meleon e scriviamo l'indirizzo

Come si può vedere dall'immagine , si apre la finestra di download: settiamo i parametri nel modo seguente

Nome file --> get_video.flv
Salva come --> All Files

Bene, a questo punto parte il download ed alla fine su disco ci ritroveremo il file FLV che è appunto il filmato riprodotto da YouTube. Per riprodurre localmente un file .FLV si può usare il freeware FLVPlayer 

update 19 Gennaio 2008

Oggi ho spostato un attimo un armadio in camera mia, nello spostarlo sento il rumore di qualcosa che scivola giù e cosa trovo: una memory card scomparsa già da tempo ed a cui avevo ormai da tempo rinunciato; la metto nel lettore collegato via usb al portatile e tra le cose inutili trovo anche una versione migliorata dell'applicativo in questione. Ci sono anche i sorgenti o meglio un pezzo dei sorgenti perchè mancano proprio parti di codice (e non mi sto riferendo a componenti Open Source scaricabili dal web, sto parlando proprio di parti di codice del programma). Ma soprattutto ci sono i binari che vanno in esecuzione correttamente: dalla maschera About risulta sempre versione 1.1 anche se si può vedere che ci sono delle cose in più tipo la georeferenziazione dell'IP con allegata bandierina e campo di ricerca nei dati sniffati con tanto di supporto di espressioni regolari; c'è anche un esempio di script in JScript integrabile nel programma. Per contro la dimensione finale dei binari è inferiore alla precedente (bohh...). Ahh ... a proposito dei binari: anche in questo caso li ho packati con l'ottimo PE Compressor WinUPack. Behh senza farla troppo lunga di seguito c'è il link a questa ulteriore versione 1.1 modificata (prima o poi mi deciderò a riscrivere il codice ed a rilasciare una versione pulita)

AppSniff 1.1 v2

 

  


 

 
 
Your Ad Here