[x] RingZ3r0  Proudly Presents [x]

Hotline Client per Windows

Un semplice esercizio di Reversing

By GEnius

Disse il tarlo alla quercia: dammi
tempo che il buco te lo faccio!

Giuseppe A.


 -------------------------------------------------------------------------------------
LE INFORMAZIONI CHE TROVATE ALL'INTERNO DI QUESTO FILE SONO PER PURO SCOPO DIDATTICO.
L'AUTORE NON INCORAGGIA CHI VOLESSE UTILIZZARLE PER SCOPI ILLEGALI.
-------------------------------------------------------------------------------------
 

--==[ ANTE SCRIPTUM ]==--------------------------------------------------------------

Odio i libri Americani in cui ogni capitolo inizia con una citazione, che tra l'altro non c'entra un cz con il capitolo in questione. Le citazioni le ammetto solo quando sono fatte da H.P. Lovercraft o da altri autori con le palle.... ma in testi scientifici non c'azzeccano proprio niente...
Per questo motivo ho deciso di iniziare il mio tut con una citazione seria e che c'entra con il tut stesso (apro Giuseppe A. è un mio amiko!).
 

--==[ TARGET ]==---------------------------------------------------------------------

Hotline ver 1.5 (build 416) http://www.hotlinesw.com
 
 

--==[ FINALMENTE IL TUT ]==----------------------------------------------------------

Ok, ok basta scaldarvi vengo al dunque! Dopo ore di studio :(((( ho deciso di prendere una pausa e di giocare con Hotline mi scarico la nuova ver e... oh czzzz la ver 1.5 (build 416) per winzoz non permettere di avviare più sessioni!! Oddio e mentre scarico gli mp3 non posso più andare in giro per i server e cercare magari qualke bella utility o un'altro bel mp3???  Eh nooooo!! Non si fà così...
Pertanto ho deciso di fare in modo che più istanze dello stesso vengano aperte contemporaneamente in modo da permettere di collegarci a più server nello stesso tempo. Colta l'occasione ho deciso di scriverci su anche un tut così mi fermo per almeno pò (non me ne tiene proprio di studiare!!). Ah..si prima che mi riempite di messaggi, lo sò che basta copiare hotline in un'altra dir per farlo far partire due istanze.. ma poi dovrei usare bookmark separati e se volessi farne partire 3 di istanze dovrei avere 3 dir diverse...nooooo siamo reverser! Facciamo le cose come si deve! E allora visto che ci siamo famo qualke piccolo ritocco anche al programma ed in particolare: eliminiamo quella brutta about box che compare all'inizio, ed impostiamo come directory di default per il bookmark quella standard (nel mio winzoz 98 quando salvo il bookmark hotline usa come default la dir documenti :-[ ).

Il tut è diviso in due: livello GURU e livello NEWBIES-MEDIUM (così la smettete di dire che nel sito di RingZero non ci sono tut per Guru!).

PARTE PRIMA: LIVELLO GURU.
Scaricatevi Hotline, e fate in modo che più istanze possano funzionare contemporaneamente, indi eliminate l'about box iniziale e fate in modo che la dir di default per il salvataggio dei bookmark sia ".\bookmarks". Volete sapere come?? Ahhh... scusate dimenticavo siete Guru mika devo dirvelo io come fare, lo sapete già :)

PARTE SECONDA: LEVELLO NEWBIES-MEDIUM
Ohhhh, finalmente posso parlare con gente del mio livello :)
Allora fate partire hotline, quindi tentate di avviarla ancora una volta, noterete il messaggio "Cannot open or delete file because it is in use (busy)".. ummm messaggio strano.. hanno usato uno strano metodo per permettere ad un'applicazione di essere lanciata una sola volta. Bah..cmq dal messaggio intuiamo subito che il prob avviene in apertura o cancellazione di un file bloccato. Carichiamo il symbol loader di softice, e quindi l'eseguibile (hotline.exe)... SOPRESA!!! NOOOO!!! NON E' POSSIBILE! ALTRI CODER COGLIONI!!!! Nella rel hanno lasciato le info di debug attive!!!!!! Cosa significa? Che possiamo vedere il codice del programma!!!! Volete fare un appz come hotline? Caricate le info di debug e copiatevi il programma!!! Coder Mac... bah.. lasciamo perdere và.. ora il loader cerca i file c e cpp dell'appz (peccato che si siano dimenticati di metterceli nella rel!) scegliete skip all (logicamente) e provate a tracciare un pò il programma.. che bello con i debug attivi no?? Si capisce tutto! Comunque a questo punto avendo conosciuto il livello leim  [xoA (TM)] dei coder mi viene il dubbio che non sia del tutto voluto il blocco delle più istanze!
Ok ora appare chiaro il problema, viene aperto un file senza le opzioni di sharing lettura/scrittura dello stesso, in pratica l'appz vuole un uso esclusivo del file (che stronza!). Visto che i nostri amici coder ci hanno lasciato le info di debug, possiamo tranquillamente tracciare l'appz a mano, istruzione per istruzione evitando di tracciare le call che non ci interessano (possiamo evitare di tracciare tutte le call, quelle importanti sono solo main e CMyapplication::StartUp). Così facendo arriviamo subito alla conclusione che il problema si presenta nella funzione CMyNewsReadHistory::CMyNewsReadHistory . Proviamo a tracciare anche questa funzione (in realtà è un metodo di una classe :D ), per localizzare il problema e ci accorgiamo ora che il programma si blocca quando viene chiamata la routine UfileSys::Open (come era logico attendersi). Tracciando la routine vedrete il seguente codice:

004859DF 6A00                    push 00000000 // hTemplateFile
004859E1 6A00                    push 00000000 // dwFlagsAndAttributes
004859E3 6A03                    push 00000003 // dwCreationDistribution
004859E5 6A00                    push 00000000 // lpSecurityAttributes
004859E7 8B45F4                  mov eax, dword ptr [ebp-0C]
004859EA 50                      push eax // dwShareMode UAOOOOO!!!!!  <----
004859EB 8B45F0                  mov eax, dword ptr [ebp-10]
004859EE 50                      push eax // dwDesiredAccess
004859EF 8B5508                  mov edx, dword ptr [ebp+08]
004859F2 8B4208                  mov eax, dword ptr [edx+08]
004859F5 50                      push eax // *lpFileName
004859F6 FF159C654F00            Call KERNEL32.CreateFileA

Viene quindi chiamata l'api CreateFileA, ma tracciando ci accorgiamo che dwShareMode, viene posto ad 1 (FILE_SHARE_READ), ed è proprio questo che crea il problema. Infatti la prossima istanza del processo non potrà avere accesso in scrittura sul file stesso. Per rendere il file leggibile e scrivibile da tutte le istanze dovremmo rendere il file condivisibile in lettura e scrittura, cioè dovremmo impostare dwShareMode a 3. Possiamo ad esempio sostituire il codice a con una PUSH 3, e due NOP (in Sice A 004859E7;PUSH 3;NOP;NOP), in modo da far sì che ogni file che verrà aperto sarà shared. Sì, sì lo sò non è la soluzione ideale ma è la più semplice e poi non ho altro tempo da dedicare a hotline oggi!! Proviamo quindi ad apportare queste modifiche sull'eseguibile, lo facciamo partire... nOoooooooo!!!.. il programma si blocca e da errore!!! cz un crc check... E adesso cosa facciamo? Beh, niente di più facile cerchiamo tra i simboli di debug se c'è una routine con il nome che ci può interessare (In Sice basta usare il comando SYM). E cosa scopriamo? Una bella funzione chiamata CrashIfCorrupt (beh sembra la nostra no?!!); troviamo subito la locazione in cui viene chiamata (In Sice con il comando BPX CrashIfCorrupt e quindi P RET):

004025C5 81ECF8030000            sub esp, 000003F8
004025CB 898D04FCFFFF            mov dword ptr [ebp+FFFFFC04], ecx
004025D1 8B9504FCFFFF            mov edx, dword ptr [ebp+FFFFFC04]
004025D7 C1EA10                  shr edx, 10
004025DA 899508FCFFFF            mov dword ptr [ebp+FFFFFC08], edx
004025E0 E86BF0FFFF              call CrashIfCorrupt         <----
004025E5 A10C9C4C00              mov eax, dword ptr [004C9C0C]
004025EA 2503000000              and eax, 00000003
004025EF 3D00000000              cmp eax, 00000000
004025F4 7511                    jne 00402607
004025F6 8B150C9C4C00            mov edx, dword ptr [004C9C0C]
004025FC C1EA10                  shr edx, 10
004025FF 399508FCFFFF            cmp dword ptr [ebp+FFFFFC08], edx
00402605 740B                    je 00402612
00402607 6A01                    push 00000001
00402609 6A01                    push 00000001
0040260B E8B0E70700              call Fail_
00402610 59                      pop ecx
00402611 59                      pop ecx
00402612 8D850CFCFFFF            lea eax, dword ptr [ebp+FFFFFC0C]  <--
00402618 50                      push eax
00402619 E872B30800              call 0048D990
0040261E 59                      pop ecx
0040261F 6A00                    push 00000000
00402621 6A00                    push 00000000
00402623 6A00                    push 00000000
00402625 6A00                    push 00000000
00402627 6A08                    push 00000008

dal codice ci accorgiamo che dobbiamo evidentemente saltare a 00402612, quindi mettiamimo un jump 00402612 nella locazione 004025E0 (in Sice A 004025E0;jump 00402612), ed il gioco è fatto, niente più crc check!!!

Passiamo ora alle altre modifiche da fare, ed in particolare alla rimozione della about box. Facendo una semplice ricerca tra i simboli di debug oppure facendo un pò di sano trace ci accorgiamo che esiste una routine chiamata CMyApplication::DoAbout.. sembra proprio essere quella che vogliamo eliminare... ecco il codice:

00402F6B 8B8D04FCFFFF           mov ecx, dword ptr [ebp+FFFFFC04]
00402F71 E83A7E0000             call CMyApplication::DoAbout <-|   <----
00402F76 8D65F8                 lea esp, dword ptr [ebp-08]    |
00402F79 5E                     pop esi                        |
00402F7A 5B                     pop ebx                        |
00402F7B 5D                     pop ebp                        |
                                                               |
.........                                                      |
                                                               |
0040ADB0 55                      push ebp                  <---|
0040ADB1 89E5                    mov ebp, esp
0040ADB3 56                      push esi
0040ADB4 83EC20                  sub esp, 00000020
0040ADB7 894DDC                  mov dword ptr [ebp-24], ecx
0040ADBA 803D01904C0000          cmp byte ptr [004C9001], 00
0040ADC1 750F                    jne 0040ADD2

basta quindi sostituire il codice all'indirizzo 0040ADB0 con un bel RET ed il gioco è fatto (in Sice, A 0040ADB0;RET). Non rivedrete mai più questa schermata nella vostra ver di hotline, nemmeno premendo il tasto info :)
Infine cerchiamo di risolvere uno dei problemi più stupidi creati proprio da M$ con win98. In win98 infatti quando viene chiamata l'Api GetSaveFileName con il membro lpstrInitialDir della struttura passata come parametro, con il valore NULL, la directory iniziale assegnata sarà "Documenti". Questo provoca la spiacevole situazione di essere costretti a cambiare directory ogni volta, se non si vuole salvare tutti i dati nella directory Documenti. Vogliamo quindi inizializzare tale membro della struttura da passare a GetSaveFileName in modo che sia Bookmarks quella predefinita. Per far ciò basta semplicemente mettere un breakpoint su GetSaveFileNameA (in Sice GetSaveFileNameA). Sice si fermerà quì:

00486376 8D55C8                  lea edx, dword ptr [ebp-38]
00486379 8995B8EEFFFF            mov dword ptr [ebp+FFFFEEB8], edx
0048637F C7857CEEFFFF4C000000    mov dword ptr [ebp+FFFFEE7C], 0000004C
00486389 BA00000000              mov edx, 00000000
0048638E 899580EEFFFF            mov dword ptr [ebp+FFFFEE80], edx
00486394 BA00000000              mov edx, 00000000
00486399 899584EEFFFF            mov dword ptr [ebp+FFFFEE84], edx
0048639F BA00000000              mov edx, 00000000
004863A4 899588EEFFFF            mov dword ptr [ebp+FFFFEE88], edx
004863AA BA00000000              mov edx, 00000000
004863AF 89958CEEFFFF            mov dword ptr [ebp+FFFFEE8C], edx
004863B5 BA00000000              mov edx, 00000000
004863BA 899590EEFFFF            mov dword ptr [ebp+FFFFEE90], edx
004863C0 BA00000000              mov edx, 00000000
004863C5 899594EEFFFF            mov dword ptr [ebp+FFFFEE94], edx
004863CB 8D95C8EEFFFF            lea edx, dword ptr [ebp+FFFFEEC8]
004863D1 899598EEFFFF            mov dword ptr [ebp+FFFFEE98], edx
004863D7 C7859CEEFFFF00100000    mov dword ptr [ebp+FFFFEE9C], 00001000
004863E1 BA00000000              mov edx, 00000000
004863E6 8995A0EEFFFF            mov dword ptr [ebp+FFFFEEA0], edx
004863EC BA00000000              mov edx, 00000000
004863F1 8995A4EEFFFF            mov dword ptr [ebp+FFFFEEA4], edx
004863F7 BA00000000              mov edx, 00000000   // lpstrInitialDir <--------
004863FC 8995A8EEFFFF            mov dword ptr [ebp+FFFFEEA8], edx
00486402 C785B0EEFFFF06002000    mov dword ptr [ebp+FFFFEEB0], 00200006
0048640C BA00000000              mov edx, 00000000
00486411 668995B4EEFFFF          mov word ptr [ebp+FFFFEEB4], dx
00486418 BA00000000              mov edx, 00000000
0048641D 668995B6EEFFFF          mov word ptr [ebp+FFFFEEB6], dx
00486424 BA00000000              mov edx, 00000000
00486429 8995BCEEFFFF            mov dword ptr [ebp+FFFFEEBC], edx
0048642F BA00000000              mov edx, 00000000
00486434 8995C0EEFFFF            mov dword ptr [ebp+FFFFEEC0], edx
0048643A BA00000000              mov edx, 00000000
0048643F 8995C4EEFFFF            mov dword ptr [ebp+FFFFEEC4], edx
00486445 8D857CEEFFFF            lea eax, dword ptr [ebp+FFFFEE7C]
0048644B 50                      push eax
0048644C E833AC0300              Call comdlg32.GetSaveFileNameA

Come si vede dal codice il membro lpstrInitialDir è inizializzato a 0. Ora vogliamo inizializzarlo con la stringa ".\bookmarks" per far questo ci basta trovare un pò di spazio libero alla fine di qualche section ad esempio all'indirizzo 004C8FA0 e scriverci quì la stringa (in sice E 004C8FA0 e quindi inserirci la stringa con il path... ahh dimenticavo la stringa deve finire con il carattere 0 ovviamente!). Fatto questo basta ora cambiare il codice all'indirizzo 004863F7 con MOV EDX,004C8FA0 e potremo finalmente salvare i nostri bookmark in maniera veloce.

Ora avrete una copia di hotline un pò più funzionale..questo è il bello del reversing possiamo modificarci i programmi a nostro piacimento... altro che semplice cracking :)

--==[ POST SCRIPTUM ]==--------------------------------------------------------------

Ho scritto stò tut in un momento di follia frustato dallo studio e pensando a Neu, Xoa, +Mala, Suby, Yan e gli altri che si stavano divertendo all'Hack IT alla faccia mia :(
Quindi il tut è dedicato proprio a loro... (Neu, Xoa, +Mala, Suby, Yan etc )
quindi quntomeno LEGGETEVELO ED CAPITE COSA DEVE FARE UN POVERACCIO CHE PENSA A VOI CHE STATE LI' A DIVERTIRVI!!!!!
Spero che almeno il mio tempo non sia stato sprecato e che quello che ne è venuto fuori possa essere d'aiuto a qualkuno.

--==[ GREETINX ]==-------------------------------------------------------------------

Kill3xx, Neural_Noise, YanOrel, +Malattia, Kry0, TeX, War-Lock, XoANINO etc... tutti i mebri di RingZer0 e gli altri amici di Crack-it. (Eddai non me ne tiene proprio di riscriverli tutti!)