BlackBoard Products
Mass Keygenning! oh yeah!

10-01-2003

by Pincopall

 

UIC's Home Page

Published by Quequero


Io sono innocente ...

Pinco te le stai rigirando tutte le case che fanno protezioni di massa??? hiihihiih grazie gran bel tute.. poveretti ;pp

... questa è istigazione al keygenning!

....

Home page se presente: http://pincopall.has.it/
E-mail: [email protected]
Pincopall on #crack-it #hackmaniaci #asm ecc..

....

Difficoltà

(P)NewBies ( )Intermedio ( ) Avanzato ( )Master

 

Dunque, avrete letto il sottotitolo e vi sarete domandati cosa diavolo io intenda con "Mass Keygenning" bhè, è una libertà letteraria :p che mi sono preso modificando l'espressione "Mass Defacement" anche se preciso che il keygenning è del tutto diverso dalla, a mio avviso, deplorevole e lamera pratica del defacement, ma comunque.. "Mass Keygenning" in quanto in questo tutorial vedremo come creare il keygenerator di un prodotto della BlackBoard Software e vedremo come adattarlo ad un altro prodotto sempre della BlackBoard, fino ad arrivare a praticamente TUTTI i prodotti della già citata Software House =).


BlackBoard Software
Mass Keygenning
Written by Pincopall

Introduzione


Bhè prima vedremo come scovare la routine di calcolo del serial, poi faremo un keygenerator che crei il serial adatto al nostro nome, e poi vedremo come e cosa cambia dal keygen di un prodotto BB a quello di un altro =)

Tools usati


SoftIce 4.x
IDA 4.3.0
Tasm ---- Per il keygen =)

URL o FTP del programma

Dunque, come cavia useremo Turbo Transfer 1.1a che trovate, così come tutti gli altri prodotti BlackBoard su www.blackboardsoftware.com

Notizie sul programma

La BlabkBoard spazia dai programmi di grafica (Eyesee v7.1) a quelli di gestione delle mail (Mail Responder) a un mucchio di altre cose =)

Essay


Allora partiamo, installato il programma lo lanciamo ed ecco apparire una message box che ci informa gentilemente che il programma si bloccherà tra 7 giorni..vabbè...premiamo ok...andiamo a registrarci và...mica vogliamo vedere bloccari stò programma eh!..dunque "Help"-"Register"..nome e serial a caso, premiamo OK, e TAC, si chiude la edit box dove inseire il nome senza dirci niente...vabbè..vediamo che possiamo fare con SoftIce o con IDA =)
Allora, da SoftIce la via che per ora sembra possibile seguire è quella del bpx hmemcpy, ma come si sa, quando si usa questo bp le cose diventatno sempre lunghe, vediamo dunque prima cosa possiamo fare, innanzitutto facciamo disassemblare il file a IDA, ed andiamo a vedere se c'è qualcosa di interessante nei Names, troviamo una stringa che forse può esserci d'aiuto, la stringa "registered", che viene mossa in eax quà :


:0046D700 B8D0D84600              mov eax, 0046D8D0

Guardiamo più sopra e vediamo che quà ci si arriva dopo tutta una serie di call, e se nn si salta ad un jnz che si trova all'offset 46D66F, poco più sopra vediamo invece tutta una serie di istruzioni che si ripetono periodicamente, tra le quali dei jnz, esse iniziano quà:

:0046D460    mov edi, eax
:0046D462    mov eax, dword ptr [ebp-04]
:0046D465    mov edx, 0046D77C
:0046D46A    call 00403F98
:0046D46F    jne 0046D476
:0046D471    mov ebx, 00000013

* Referenced by (C)onditional Jump at Address:
|:0046D46F(C)
|
:0046D476    mov eax, dword ptr [ebp-04]
:0046D479    mov edx, 0046D788
:0046D47E    call 00403F98
:0046D483    jne 0046D48A
:0046D485    mov ebx, 00000026

* Referenced by a (C)onditional Jump at Address:
|:0046D483(C)
|
:0046D48A    mov eax, dword ptr [ebp-04]
:0046D48D    mov edx, 0046D794
....

E si concludono quà :




:0046D64A    call 00403F98
:0046D64F    jne 0046D656
:0046D651    mov ebx, 000002EF

* Referenced by (C)onditional Jump at Address:
|:0046D64F(C)
|
:0046D656    mov eax, dword ptr [ebp-04]
:0046D659    mov edx, 0046D8A8
:0046D65E    call 00403F98
:0046D663    jne 0046D66A
:0046D665    mov ebx, 0000031A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046D663(C)
|
:0046D66A    add ebx, dword ptr [esi+34]
:0046D66D    cmp ebx, edi
:0046D66F    jne 0046D70A
:0046D675    lea edx, dword ptr [ebp+FFFFFE20]
:0046D67B    mov eax, esi


Bene...dunque al "Registered" ci si arriva se il jne 0046D70A non salta, e quindi se ebx = edi, ovvero se la somma di quello che c'era prima in ebx e in esi+34 è uguale a edi.
Ok, mettiamo allora un breakpoint all'inizio di questa serie di istruzioni periodiche dopo essere entrati, ad esempio grazie al bpx hmemcpy nel corso del programma Turbo Transfer, mettiamo dunque un bpx 46D450, e quando Sice poppa, dopo aver premuto OK, ci troviamo quà :

:0046D450       mov eax, dword ptr [ebp-0C]<--- Muove in eax il nostro nome  

:0046D453       call 00404090<--- In questa call controlla che il nome esista e ne estrae la penultima lettera  
:0046D458       mov eax, dword ptr [ebp-10]<--- Muove in eax il serial da noi immesso  

:0046D45B       call 00408A98<--- In questa call calcola il corrispettivo esadecimale del serial..  

:0046D460       mov edi, eax<--- ..che viene poi mosso da eax in edi.  

:0046D462       mov eax, dword ptr [ebp-04]<--- Muove in eax la penultima lettera del nostro nome. 

:0046D465       mov edx, 0046D77C<--- Muove in edx il carattere "a"  

Bhè il seguito di questa routine lo ho messo sopra =) nella call 00403F98 confronta tra le altre cose, se eax=edx, se lo è il jnz successivo non salta, e viene messo in ebx il valore 13, se invece eax, quindi il penultimo carattere del nostro nome, nn è "a", il jnz salta, il programma mette in edx il contenuto di 46D788, ovvero il carattere "b", controlla di nuovo se "b" è la penultima lettera del nostro nome e se lo è mette in ebx il valore 26 mentre se nn lo è va avanti e così via....ora...io ho messo Pincopall come nome, e la mia penultima lettera è la "l", e il programma, dopo aver visto questo, mette in ebx il valore esadecimale 11B, quindi va avanti fino all'offset 46D66A, in cui aggiunge a ebx il contenuto di "esi+34", ed il tutto viene poi confrontato con il valore contenuto in edi, che è poi il valore hex del serial da noi immesso.
Basta quindi guardare cosa c'è in "esi+34", aggiungergli 11B, trasformare in tutto in un numero decimale per avere il serial giusto per il nick "Pincopall" , e nn solo, per tutti i nomi, di qualsivoglia lunghezza aventi la "l" come penultima lettera!.
C'è una altra cosa da vedere, i valori che vengono messi in ebx non sono casuali, infatti, se la nostra penultima lettera è "a" in ebx viene messo il valore 13h, se è "b" il valore 26h=13+13h, se "c" 3Ah=13h+13h+14h , se "d" 4Fh=13h+13h+14h+15h e così via fino a chè non si arriva alla "z" per cui il valore da metter in ebx sarà 13h+13h+14h+15h+16h+...+2Bh=31Ah.
Ah...ovviamente il valore in [esi+34] non dipende assolutamente dal nome, ma è una costante decisa dal programmatore del Turbo Transfer che ne ha posto il valore pari a 74Eh, ovvero 1870, dunque, che voi vi chiamiate Pincopall, Eolo, Mammolo, Pisolo, Brontolo, Cucciolo o Gongolo =)) il vostro serial sarà sempre 1870+283 (283=11Bh), ovvero 2153.
Già...questo era per il Turbo Transfer...ma noi abbiamo parlato di Mass Keygenning no? Eh infatti...cosa cambia da un prodotto all'altro della BlackBoard in fatto di protezione? Non ci crederete...cambia solo il valore della costante in [esi+34]!! Ma questi dove la mettono la testa quando fanno i programmi? Bah NdQue Volete calcolarvi il serial per BlackBoard FileHide 1.1? fate lo stesso procedimento sopra per quanto riguarda il valore da mettere in ebx e come costante aggiungentegli 1968, per Eyesee 7.1? la costante è 1236, per FileWipe 7.1? la costante è 1898 etc...
Well...trovare il serial è stata una boiata..facciamoci un keygen in assembler ora =)
Ecco i sorgenti commentati..per diminuire la lunghezza del tutorial vi risparmio tutta la creazione e dichiarazione della parte grafica, dei pulsanti, delle stringhe ecc..per passare subito alle routine importanti (cmq..per quanto riguarda la grafica, guardate gli altri miei tut contenenti dei src di keygenerators =)

CalcolaSeriale      proc  
      push 50			; max caratteri	
      mov ebx,offset mybuffer
      push ebx     		; buffer d testo	
      push [EditHWnd] 		; handle dell'edit
      Call GetWindowTextA  
      cmp eax, 1  ; il nome ha almeno una lettera?
      jl nonvabene ; no? allora non va bene
      mov edi,1236 ; mettiamo in edi il valore 1236 decimale
      xor ecx, ecx ; azzera ecx
      sub eax,2
      mov dl, byte ptr[ebx+eax] ; Muoviamo in dl la penultima lettera del nostro nome, vi ricordo
				; che dopo il getwindowtexta in ebx abbiamo il contenuto dell'edit box
				; ed in eax abbiamo la lunghezza =)
      mov bl,96	      ; muoviamo in bl il valore del carattere ascii "a" meno 1, il programma ( EyeSee )
		      ; reputa infatti che il penultimo carattere del vostro nome sia per forza minuscolo	    
				
ciclo1:
	inc cl			; incrementiamo cl e bl (che la prima volta varrà "a",poi "b",ecc...)
	inc bl
	cmp bl,dl		; è il nostro penultimo carattere? se no...
	jne ciclo1		; ricomincia il ciclo, se si
	cmp cl,1		; guarda se cl è 1, quindi se il penultimo char è "a"
	jne seclno1		; se nn lo è salta,
	add edi,19		; se lo è aggiunge a 4D4, il valore 13h
	mov eax,edi		; muove edi in eax, visto che questo ci servirà come preparazione
	call EsinDec		; alla call di trasformazione da esadecimale in decimale
	jmp msgbox		; al ritorno da questa potremmo mostrare il seriale =)
	
seclno1:
	call vediamo		; se la penultima lettera non è "a" ..vediamo =)
	call EsinDec
msgbox:	
mov eax,ebp			; dopo la call EsinDec mettiamo il serial in eax
mov byte ptr[eax+4],00		; poniamo a null in quinto byte d eax, il nostro serial sarà
				; infatti sempre di 4 cifre=) e
; Creiamo l'edit Box invece della solita messagebox =)
        push    0                      ; lpParam
        push    [AppHWnd]              ; hInstance
        push    40h                    ; ID dell'edit
        push    [NewHWnd]              ; parent hwnd
  	push    20                    
        push    260             
        push    85                 ; y
        push    50                    ; x
        push    WS_BORDER OR WS_VISIBLE OR WS_CHILD 
	push    eax                ; il serial =)
        push    offset EditClass     
        push    0                     
        call    CreateWindowExA
jmp  msg_loop
CalcolaSeriale endp

vediamo proc  
push eax		; dunque pushiamo eax ed ebx
push ebx
xor eax, eax		; azzera eax
add edi, 19		; aggiungiamo 13h ad edi che vale 4D4h
dec ecx  		; in ecx c'è la differenza, se ci pensate, tra il valore hex del nostro
			; penultimo carattere e il valore 96dec, e questa prima sottrazione ci serve
			; nel caso che il char nostro sia "b", infatti il prog aggiunge 2 volte 13h,
			; se abbiamo "b", sarebbe stato diverso se avesse fatto semplicemente 13h+14h =)

risottrai: 

dec ecx		; dunque risottraiamo 1 da ecx
mov ebx,19	; mettiamo 13h in ebx
add ebx,ecx	; a questo aggiungiamoci l'attuale valore d cl, vedete che se il nostro char è "b"
		; cl valeva 2 prima, ora vale 0 ed a essere aggiunto a eax è 13h, se il npstro char è "c"
		; invece cl valeva all'inizio 3 e ad esser addizionati ad eax saranno 13h e 14h, e così via.
add eax,ebx
test ecx,ecx    ; questo finche ecx è zero
jnz risottrai
add edi,eax     ; aggiungiamo eax ad edx, che già contiene 4D4h+13h
pop ebx		; ripoppiamo ebx ed eax
pop eax
ret
vediamo endp


EsinDec proc    ; ecco la call che porta da esadecimale in decimale il nostro numero

	   ; pushiamo i registri il cui attuale valore ci servirà anche dopo
	push edx
	push ecx
	mov eax,edi	  ; il numero da convertire in hex lo mettiamo in eax
	mov ecx, 10       ; e muoviamo in ecx 10 (0Ah)
	mov [ebp],eax     ; ed in ebp, il valore di eax, che è poi il numero da mettere in dec.

ciclo3:
	xor edx, edx      ; azzeriamo edx
	div ecx		  ; e dividiamo eax per ecx, con il quoziente che và a finire in eax ed
			  ; il resto che và a finire in edx
	add dl, 48	  ; resto a cui aggiungiamo 48 ( 30h ), e se avete a disposizione una	
			  ; tavola ascii capite il perchè =)
	cmp dl, 58        ; e che poi confrontiamo con 58, ovvero con il valore decimale del primo 
			  ; carattere nn numerico nell'ordine delle tabelle ascii ovviamente.
	jb decrementaEbp  ; Se più piccolo si salta
	add dl, 07	  ; altrimenti se è più grande gli si aggiunge un 07. 
decrementaEbp:
	dec ebp		  ; Decrementiamo ebp
	mov [ebp],dl	  ; ed in ebp decrementato si mette il numero ottenuto.
	or eax, eax       ; Se eax non è ancora zero
        jne ciclo3        ; si ricomincia il ciclo.
	pop ecx           ; Alla fine si poppa tutto stando attenti alla regola del LIFO
	pop edx		  ; (Last In First Out) per quanto riguarda lo stack...
	ret		  ; e si ritorna =)
EsinDec  endp

nonvabene:			; MessageBox di edit vuota=)
push MB_OK OR MB_ICONEXCLAMATION
push offset error	
push offset noname
push NULL
Call MessageBoxA
jmp msg_loop

End Start     ; e fine del programma. 
Ok, anche il keygen è stato facile da fare=) come vi ho detto mancano le stringhe chiamate "noname" o "error", ma si capisce anche dal loro nome cosa vogliano significare no? come vi ho detto già sopra poi la dichiarazione di stringhr ecc..la ho saltata per velocizzare =).
Well nel fare i keygen dei vari prodotti BB, ovviamente solo per vedere se è vero che funzionano tutte così le routine, c'è solo da tenere qualche piccolo accorgimento, ad esempio, nel caso che la nostra costante sia di tre cifre, ad esempio sia 211, ad essere mostrare nella edit box con il serial non dovranno essere 4 cifre, bensì 3, perchè il serial sarà fatto da 3 cifre, se invece avremo una costante del valore ad esempio di 900, allora la cosa sarà un pizzico più interessante, infatti se il nome avrà come penultima lettera una lettera che nell'alfabeto viene dopo la "e", "e" compresa, il serial sarà di 4 cifre, mentre se la penultima lettera verrà prima della "e", il serial sarà di 3 cifre..bhè cmq la cosa nn mi sembra difficile da fare...che ne dite? =)
Bhè abbiamo finito, ora sappiamo fare un keygenerator per qualsiasi prodotto BlackBoard! ihihih basta brekkare dove sappiamo =) e vedere che c'è in [esi+34] ed abbiamo finito =).

Bye Bye,
Pincopall.




Note finali

Well un saluto a tutti i frequantatori dei chan che frequento (#crack-it, #asm, #hackmaniaci, ecc..)

Un saluto particolare a Britney Spears (Wo..baby..you were great last night ) e a Quequero, la mia ROSSA preferita (You also were great last night baby!) Grazie anche tu non scherzi eh ;p NdQue
deh hihihihi
CiauuuuuuZ

Disclaimer

Vorrei ricordare che la BlackBoard ha quà dimostrato di non avere fondi a sufficienza per pagare programmatori in grado di sviluppare uno schema d protezione degno di questo nome, quindi fate qualcosa, sviluppate voi un algo un po' più bello e mandatelo alla povera software house che ci siamo divertiti a maltrattare in questo tut.!,

Ovviamente le informazioni date in questo tutorial sono a puro scopo didattico e servono appunto per invogliarvi a dare una mano a questa povera software house!!

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