Patch su Msn

13 08 2008

Ciao a tutti, avevo questo articolo come bozza ma non l’ho reso pubblico per molto tempo. Oggi ho deciso di postarlo per illustrare quello che si può fare con il reversing; precisamente riguardo una patch applicabile a Windows Live Messenger (aka Msn).

Questa patch riguarda la rimozione dell’intervallo di tempo fra un trillo e l’altro, quindi permette di trillare senza limiti o intervalli. Voi direte: “E beh? Niente di nuovo.” . Infatti. Solo che non si tratta della solita pappa pronta (A-Patch o altre cose del genere), bensì vi mostrerò, per i più curiosi, il procedimento con cui si rimuove l’intervallo manualmente, attraverso il Reversing.

Sì, il reversing, mi sto avvicinando pian piano a questo argomento e devo dire che mi affascina molto. Per chi non lo sapesse, è quella che molti chiamano “arte” che consiste nello “smontare” un file (es. un .exe) e studiarne le funzioni, cercare di carpirne le informazioni per raggiungere un determinato scopo, come oltrepassare le protezioni che ci sono in alcuni programmi (limitazioni di 30 giorni e via discorrendo). Ovviamente come in ogni cosa c’è chi ne fa un cattivo uso e chi no. C’è chi reversa per crackare e chi reversa per imparare esclusivamente a scopo di studio e perchè no, per soddisfazione personale.

E così dopo essermi informato un pò ho deciso di mettere in pratica, o almeno provarci, quello che avevo imparato. Quindi, dopo questa intro (un pò noiosa lo so 😀 ) possiamo addentrarci nel vivo della patch.

Apriamo l’eseguibile (msnmsgr.exe) con OllyDbg e, dopo aver analizzato il file, Olly ci porterà direttamente all’Entry Point:

006CD70D > $ E8 5B060000    CALL msnmsgr.006CDD6D

Ok, ora la cosa più logica da fare è cercare un timer che regoli l’intervallo fra i trilli. Quest’intervallo è settato a 11000 ms. (11 secondi) e sapendo questo possiamo subito escludere gli altri timer. Ma dato che non sappiamo dove si trova fra tante righe di listato, premiamo ALT+F1 e digitiamo: bpx SetTimer

Con questo comando piazziamo un breakpoint su tutte le chiamate a SetTimer. Ora premendo F9 debuggiamo il programma e, dopo aver effettuato il login a Msn, andiamo su una finestra di conversazione e premiamo sul tasto del trillo. Ecco che subito Olly brekka (è la riga in rosso):

004DCA77  |. 8B1D B01A4000  MOV EBX,DWORD PTR DS:[<&USER32.SetTimer>>;  USER32.SetTimer
004DCA7D  |. 74 25          JE SHORT msnmsgr.004DCAA4
004DCA7F  |. 8B46 28        MOV EAX,DWORD PTR DS:[ESI+28]
004DCA82  |. 57             PUSH EDI                                 ; /Timerproc
004DCA83  |. 68 F82A0000    PUSH 2AF8                                ; |Timeout = 11000. ms
004DCA88  |. 68 90010000    PUSH 190                                 ; |TimerID = 190 (400.)
004DCA8D  |. 50             PUSH EAX                                 ; |hWnd
004DCA8E  |. FFD3           CALL EBX                                 ; \SetTimer
004DCA90  |. 85C0           TEST EAX,EAX
004DCA92     75 09          JE SHORT msnmsgr.004DCA9D

Siamo alla parte cruciale della patch. Se scendiamo 2 righe più sotto del breakpoint da noi settato troviamo un interessante salto condizionato (JE SHORT msnmsgr.004DCA9D). Il salto così com’è punta all’offset 004DCA9D, facendo così verificare la comparsa della scritta sulla conversazione: “Non è possibile inviare trilli a un contatto troppo spesso.“. Ok, e se noi cambiassimo quel JE con un JNZ? Proviamo. Selezioniamo la riga, premiamo spazio e cambiamo il JE in JNZ. Avremo questo:

004DCA77  |. 8B1D B01A4000  MOV EBX,DWORD PTR DS:[<&USER32.SetTimer>>;  USER32.SetTimer
004DCA7D  |. 74 25          JE SHORT msnmsgr.004DCAA4
004DCA7F  |. 8B46 28        MOV EAX,DWORD PTR DS:[ESI+28]
004DCA82  |. 57             PUSH EDI                                 ; /Timerproc
004DCA83  |. 68 F82A0000    PUSH 2AF8                                ; |Timeout = 11000. ms
004DCA88  |. 68 90010000    PUSH 190                                 ; |TimerID = 190 (400.)
004DCA8D  |. 50             PUSH EAX                                 ; |hWnd
004DCA8E  |. FFD3           CALL EBX                                 ; \SetTimer
004DCA90  |. 85C0           TEST EAX,EAX
004DCA92     75 09          JNZ SHORT msnmsgr.004DCA9D

Proseguiamo col debug (F9) e vediamo che l’intervallo è stato rimosso con successo!

Ora non ci resta che salvare l’eseguibile patchato. Quindi clicchiamo col destro su una riga di listato e selezioniamo Copy>All modifications. Nella finestra che ci si apre clicchiamo ancora col destro e poi su Save. Scegliamo il percorso, salviamo il file, sostituiamolo a quello originale e il gioco è fatto, Msn con trilli infiniti!

P.S. Per chi è interessato al reversing riporto alcuni link utili:

  • OllyDbg 1.10 (Debugger)  –> Link
  • Guida al reversing by Ctrl_alt_canc (PDF)  –> Link

Alla prossima





2 piccoli trucchi per chi si è avvicinato ora al VB.Net

24 08 2007

Eccomi di nuovo qua, oggi scriverò due piccoli trucchi per il VB.Net, rivolti soprattutto a chi ha scoperto da poco questo linguaggio e cerca una soluzione ad un problema. I problemi di cui scriverò sono: “Come fare ad abilitare un pulsante SOLO quando 1 o più TextBox sono piene (cioè vi si è scritto dentro)” e “Avere l’ora di Windows su un proprio programma come quella nella SysTray (vicino all’orologio)”.

Partiamo con il primo problema.

Nel caso di una sola TextBox è davvero semplice. Settiamo la Proprietà Enabled del nostro pulsante a False; nell’evento TextChanged della TextBox che ci interessa, dobbiamo scrivere questo codice:

Codice:

If TextBox1.TexLength <> 0 Then
      Button1.Enabled = True
Else
      Button2.Enabled = False
End If

Invece, mettiamo il caso di 2 TextBox. Il codice è sostanzialmente lo stesso, ma si aggiunge un And che impone che tutte e 2 le TextBox devono essere piene. Il codice dovrà essere scritto nell’evento TextChanged dell’ultima TextBox. Ad esempio se abbiamo TextBox1 e TextBox2 dovrete scrivere il codice in TextBox2:

Codice:

If TextBox1.TextLength <> 0 And TextBox1.TextLength  <> 0 Then
      Button1.Enabled = True
Else
      Button1.Enabled = False
End If

Davvero semplice 😀
Quindi il trucco (nel caso di più TextBox) sta nello scrivere il codice nell’evento TextChanged dell’ultima TextBox che ci interessa, e in più dobbiamo aggiungere per ogni TextBox che vogliamo: “And TextBoxCheCiInteressa.TextLength <> 0″.

Ovviamente al posto dei nomi TextBox1 e Button1 dovete scrivere il nome dei Vostri controlli.

Perfetto, ora passiamo al secondo problema: l’ora di Windows.
Tutti sapranno che per avere la data e l’ora di Windows bisogna scrivere qualcosa tipo:

Label1.Text = Date.Now.ToString

La proprietà Now mostrerà la data e l’ora in un preciso momento, ad esempio quando clicchiamo su un pulsante (quindi evento Click di un pulsante). Ma il brutto di questa cosa è che l’ora mostrataci rimarrà fissa al momento in cui abbiamo cliccato. Solo un altro click permetterà di aggiornare nuovamente l’ora, che tuttavia dopo il click rimarrà sempre la stessa a meno che non si clicchi un’altra volta e così via.
Per avere invece un orario aggiornato costantemente (quindi vedremo scorrere i secondi ecc.) bisogna agire in maniera diversa. Innanzitutto selezioniamo un controllo Timer e trasciniamolo sul Form. Nell’evento Load del nostro Form scriviamo:

Timer1.Enabled = True ‘Abilita il timer
Timer1.Interval = 1000 ‘Setta l’intervallo del timer a 1 secondo (1000 millisecondi)

Ok, ora nell’evento Tick del timer dobbiamo scrivere invece:

Label1.Text = TimeOfDay ‘Imposta l’ora nel testo della Label1

Ovviamente Label1 è un controllo usato per l’esempio, volendo possiamo scriverlo anche in una TextBox.

Spero che questa micro-guida possa essere utile a chi sta cercando una soluzione in merito ai problemi proposti.

Ciao!