HexWorkshop 4.23
From UIC
Hex Workshop 4.23: una protezione veramente stupida
Contents |
| Infos | |
|---|---|
| Author: | Bender0 |
| Email: | |
| Website: | http://www.bender0.altervista.org/ |
| Date: | 21/08/2004 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | |
Introduction
Una protezione veramente stupida.
Hex Workshop è un hex editor molto buono (imo), pieno di features, ed è de facto il mio hex editor di fiducia da parecchio tempo. La protezione si basa su serial fissi... che bello!
Tools
Ollydbg 1.10 o un debugger qualunque.
IDA pro (opzionale).
Link e Riferimenti
http://www.bpsoft.com per recuperare Hex Workshop.
Essay
Come ho già detto la protezione è basata su serial fissi, e infatti le altre informazioni (name e company) sono quasi una formalità. La grande preoccupazione dei programmatori che usano questo schema è che un cracker trovi un serial valido (o che qualcuno ne acquisti uno) e gli faccia fare il giro del mondo. In effetti succede sempre, ed è successo anche con Hex Workshop. E allora cosa fa il programmatore (dimenticavo di dire che Costui è un Genio) per ovviare all'annoso problema? Vediamolo di persona.
Loadiamo hwoks32.exe nel debugger e apriamo il box di registrazione (help→about→gtregister), mettiamo delle info fasulle ("bender0","bender inc","12345") e premiamo register. Sembra quasi una messagebox, e guarda un pò, lo è davvero! Breakkiamo su MessageBoxA e eseguiamo fino al ret; steppato il ret ci troviamo nel modulo bpsregwd: il fatto che questa dll lanci la messagebox e il suo nome (BreakPointSoftwareREGistration...) ci suggeriscono che tutte le procedure che riguardano la registrazione siano contenute in essa. Per spaventarci tra l'altro il programmatore (ho già detto che Costui è un Genio?) ha inserito delle chiamate a Sleep per farci pensare che il programma esegua dei calcoli così complessi che durano tre secondi, ma per qualche strano motivo ha inserito questo ritardo anche dopo la messagebox. Noi ne approfittiamo e settiamo un breakpoint su Sleep. Premiamo register, ritorniamo da Sleep e guardiamoci attorno: la prima call dal cui risultato dipende il flow è la terza, che chiama la routine all'indirizzo 10002BA0. Entriamo e vediamo subito due call; la prima è breve e chiama GetSystemTimeAsFileTime, niente di importante. Allora entriamo nella seconda, ed ecco il codice (ho rinominato qualche indirizzo):
.text:100025B0
.text:100025B0 var_4 = byte ptr -4
.text:100025B0
.text:100025B0 push ebx
.text:100025B1 xor bl, bl
.text:100025B3 call sub_10002570
.text:100025B8 mov eax, off_100231A8
.text:100025BD test eax, eax
.text:100025BF jz short esci_0
.text:100025C1 mov eax, offset off_100231A8
.text:100025C6 push esi
.text:100025C7 mov esi, eax
.text:100025C9 lea esp, [esp+0]
.text:100025D0
.text:100025D0 strcmp_loop:
.text:100025D0 mov eax, [eax] ; carica una stringa
.text:100025D2 push eax ; stringa1: ???
.text:100025D3 push edi ; stringa2: il nostro serial
.text:100025D4 call strcmp ; confronta il serial con una stringa
.text:100025D9 add esp, 8
.text:100025DC test eax, eax
.text:100025DE jnz short esci_1 ; se sono uguali ritorna 1
.text:100025E0 mov ecx, [esi+4]
.text:100025E3 add esi, 4 ; prossima stringa
.text:100025E6 test ecx, ecx
.text:100025E8 mov eax, esi
.text:100025EA jnz short strcmp_loop
.text:100025EC pop esi
.text:100025ED mov al, bl ; tutte diverse, ritorna 0
.text:100025EF pop ebx
.text:100025F0 retn
.text:100025F1 ; ---------------------------------------------------------------------------
.text:100025F1
.text:100025F1 esci_1:
.text:100025F1 pop esi
.text:100025F2 mov al, 1
.text:100025F4 pop ebx
.text:100025F5 retn
.text:100025F6 ; ---------------------------------------------------------------------------
.text:100025F6
.text:100025F6 esci_0:
.text:100025F6 mov al, bl
.text:100025F8 pop ebx
.text:100025F9 retn
.text:100025F9 B-L endp
Se questa funzione ritorna 1 molto codice viene saltato e Sleep è chiamata con un timeout di 100 msec per 10 volte; poi la funzione esce ritornando 2 (che non mi sembra il tipico valore da serial corretto). Abbiamo capito che il nostro serial non deve comparire in quella lista, lista che contiene le seguenti 5 stringhe:
1616604A7 161660407 10407-021091-BBD8 10407-021941-D1D1 1616704070
Sembrano proprio dei serial, è ormai chiaro che quella funzione cercava il nostro serial in una blacklist, ovvero la hit parade dei cinque serial più piratati di Hex Workshop. Allora ho pensato "Grazie BreakPoint Software! Mi regali non uno, ma cinque serial validi per il tuo prog?". Così ho noppato il jnz all'indirizzo 10002BCB per rendere la blacklist inutile e ho cominciato a provare i serial; con mia grande sorpresa il primo non funzionava, e nemmeno il secondo. Allora ho pensato "Allora non sei così imbecille, o Genialità impersonata, o programmatore!". Ma poi ho provato il terzo codice, e quello funzionava, così come funziona il quarto. L'unica spiegazione che sono riuscito a darmi è che bpsregwd.dll sia condivisa tra diverse apps della Breakpoint Software, e che gli altri serial siano serial validi di altri programmi ;)
Note Finali
O programmatori shareware, in futuro non donateci le chiavi dei vostri software assieme ad essi, ma dateci un margine di reversing, anche noi dobbiamo divertirci!
Ovviamente per chiarimenti, migliorie o correzioni mandatemi una mail.
Ci vediamo al prossimo essay... bye.
Disclaimer
I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.
Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.