sabato 21 luglio 2007

Camfrog Hack
















Ciao a tutti,
spero che non si fraintenda quello che sto per scrivere per colpa del titolo....
Molte volte si associa la parola hacker ad un "essere" informatico cattivo che causa danni ai computer di poveri utenti ignari.
Non è una definizione corretta!!!
La definizione che mi è sembrata piu' giusta è quella di wikipedia:
<>
Bene, chiarito questo aspetto, vi spiego cosa stiamo per fare.
Molti di voi conosceranno il famoso programma di video chat "Camfrog" che tanto spopola nella rete fra i chatters...
Attraverso un po' di programmazione in visual basic.net (si può fare anche con il vb6) e qualche chiamata alle API di sistema di Windows vedremo come entrare nel programma per costruire quello che potremmo definire un BOT, cioè un robot software (programma) che è in grado di automatizzare determinati processi, oppure, data una direzione ne traccia le possibili soluzioni.
Chi di voi conosce camfrog ha gia' capito a cosa mi riferisco. Non tratterò almeno in questa fase la costruzione del database delle domande e delle risposte (non ci trovo nulla di stimolante nell'implementare un dataset) ma mi concentrerò principalmente nel logging e nell'innesto della finestra di chat delle cosiddette "room".
Come si vede dall'immagine in alto, in evidenza la finestra di una room, dietro invece il software BOT che "ascolta" tutto quello che succede in room.
All'inizio avevo sperato di riuscire ad interpretare lo scambio messaggi che avviene tra server e client per poter loggare la porta su cui avviene tale scambio.
Purtroppo dopo diversi tentativi mi sono arreso, ma spero di ritornarci presto sull'argomento.
Quello che ho usato per "loggare" camfrog non è altro che un semplice script in visual basic che rimane in ascolto non sulla porta TCP bensì sull'handle della finestra principale della room.
Un handle (letteralmente "maniglia") è un oggetto che ci permette di riferirci all'applicazione di interesse.
Ogni finestra in Windows ha un proprio handle che è univoco. Riferendoci ad un determinato handle ci riferiremo ad un oggetto specifico all'interno del sistema operativo.
Nella parte in rosso ho evidenziato il pulsante processi, una datagridview per mostrare i dati, e l'handle principale della finestra della room.
Private Sub process_view()
Dim p As Process()
p = Process.GetProcesses()
start_datagrid()
Dim row_index As Integer = 0
Dim pr1 As Process
For Each pr1 In p
Me.DataGridView1.Rows.Add()
Me.DataGridView1.Rows.Item(row_index).Cells(0).Value = pr1.Id.ToString
Try
Me.DataGridView1.Rows.Item(row_index).Cells(1).Value = pr1.Handle.ToString
Catch ex As Exception
Me.DataGridView1.Rows.Item(row_index).Cells(1).Value = "Errore: " & ex.Message.ToString
End Try
Me.DataGridView1.Rows.Item(row_index).Cells(2).Value = pr1.MainWindowHandle
Me.DataGridView1.Rows.Item(row_index).Cells(3).Value = pr1.ProcessName
Me.DataGridView1.Rows.Item(row_index).Cells(4).Value = pr1.MainWindowTitle
row_index += 1
Next
End Sub
Private Sub start_datagrid()
Me.DataGridView1.Rows.Clear()
Me.DataGridView1.Columns.Clear()
Me.DataGridView1.Columns.Add("ID", "Id")
Me.DataGridView1.Columns.Add("HANDLE", "Handle")
Me.DataGridView1.Columns.Add("MAINWINDOWHANDLE", "Main Windows Handle")
Me.DataGridView1.Columns.Add("NAME", "Nome")
Me.DataGridView1.Columns.Add("MAINWINDOW", "MainWindow")
End Sub
In queste prime due Sub non facciamo altro che inizializzare la datagrid e caricare all'interno della stessa i processi in memoria. Da notare che il ciclo try...catch che previene un errore dovuto ad insufficienti diritti di accesso per alcuni processi.
Adesso non dovete fare altro che richiamare il metodo CellContentClick e salvare l'handle in una variabile globale... ho chiamato questa variabile pr_handle.
Adesso ho evidenziato in rosso il pulsante logging e la finestra dove andremo a leggere quello che succede nella nostra room. La finestra in questione non è altro che un controllo richtext.

Private Function GetMessage()
Dim length As Long = 0
Dim strtmp As String = ""
Dim result As Long = 0
Dim Edit_handle As Long = 0
Dim int_temp As Integer
Dim strtmp2 As String = ""

If pr_handle > 0 Then
Edit_handle = FindWindowEx(pr_handle, 0, "RichEdit20A", vbNullString)
length = SendMessage(Edit_handle , WM_GETTEXTLENGTH, 0, 0) + 1
strtmp = Space(length - 1)
result = SendMessage(Edit_handle , WM_GETTEXT, length, strtmp)
Dim interpreta_b As Boolean = False
If message_old.Length < strtmp =" strtmp.Remove(0," message_old =" strtmp2" edit_handle =" FindWindowEx(pr_handle," length =" SendMessage(Edit_handle ," strtmp =" Space(length" result =" SendMessage(Edit_handle ," long =" 0" long =" 0" intptr =" Nothing" long =" 0" intptr =" Nothing"> 0 Then
Edit_handle = FindWindowEx(pr_handle, 0, "RichEdit20A", vbNullString)
Edit_handle = FindWindowEx(pr_handle, Edit_handle , "RichEdit20A", vbNullString)
ptr_temp = New IntPtr(Edit_handle )
int_temp = SendMessage(ptr_temp, WM_SETTEXT, 0, "Hello")


1) button = FindWindowEx(pr_handle, 0&, "button", vbNullString)
2) ptr_to_button = New IntPtr(button)
3) int_temp = SendMessage( ptr_to_button , WM_KEYDOWN, VK_SPACE, 0)
4) int_temp = SendMessage( ptr_to_button , WM_KEYUP, VK_SPACE, 0)

End If
End Function
Questa è la funzione da richiamare alla pressione del pulsante innesto. Vediamo nel particolare cosa fa. Controlliamo se abbiamo un handle valido quindi con la prima API richiamiamo il controllo RichEdit20A dalla finestra principale della room. In questo modo però otteniamo la finestra di lettura, allora richiamiamo la stessa API ma questa volta invece di passare l’handle della finestra principale passiamo l’handle del controllo ottenuto. Ricaveremo l’handle del secondo controllo RichEdit20A presente nella nostra room che è proprio quello che ci interessa.
Bene adesso non facciamo altro che creare un puntatore da passare alla successiva API per scrivere il testo nel controllo. A questo punto debuggando l’applicazione vedrete comparire la scritta “Hello” nel nostra finestra selezionata in rosso. Ma dobbiamo fare in modo che oltre a scrivere il testo arrivi alla room quindi dobbiamo ottenete un puntatore al pulsante Send. Le ultime 4 righe non fanno altro che:
1) Ottenere l’handle del pulsante Send
2) Ottenere il puntatore al pulsante Send
3) Simulare la pressione del tasto barra spaziatrice
4) Simulare il rilascio del tasto barra spaziatrice
Abbiamo fatto tutto. La nostra applicazione adesso è in grado di leggere e scrivere in maniera autonoma.
Gli sviluppi sono molteplici. Dalla semplice costruzione di un BOT per le domande e le risposte, ma anche Tools per il controllo degli utenti (ban, kick, colori, etc).