Hex Workshop 4.23
una protezione veramente stupida.

Data

by bender0

 

gg/mese/aaaa

UIC's Home Page

Published by Quequero

"?"

Grazie bend, la prossima volta pero' voglio un tute piu' complesso :p

"!"

....

E-mail: [email protected]

....

Difficoltà

(X)NewBies ( )Intermedio ( )Avanzato ( )Master

 

una protezione veramente stupida.


Hex Workshop 4.23
una protezione veramente stupida.
Written by bender0

Introduzione

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 usati

Ollydbg 1.10 o un debugger qualunque
IDA pro (opzionale)

URL o FTP del programma

http://www.bpsoft.com

Notizie sul programma

n\a

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->register), 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 B-L             proc near
.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.

bender0

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.

Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.