Copy Link
Add to Bookmark
Report

Hotline Client per Windows: Un semplice esercizio di Reversing

DrWatson's profile picture
Published in 
guide hacker
 · 6 years ago

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

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!)

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT