Soluzione 2° corso
(serial fishing)


9/9/99

by "Unlock"

 
 

UIC's Home Page

Published by Quequero

 

Unlock, sei stato bravissimo e sei migliorato davvero tanto nonostante il tuo form sia sempre il più brutto :) e ci siano svariati errore, ti faccio i miei più sinceri complimenti, sono davvero contento...Hei unlock, la "E" maiuscola accentata si fa con alt+212...È facile :))))

 
UIC's form
nick: Unlock
UIC's form

Difficoltà

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

 

Raga rieccoci speriamo che questa volta QUE sia più buono :-( ( scherzo s'intende ) :))))))) E dai che non sono stato cattivo :)


Titolo
 
Soluzione 2° corso
(serial fishing)
Written by Unlock

Introduzione

Forza proviamoci anche questa volta, il programma chiede un nome e un codice e noi scopriremo quello giusto :))))))

Tools usati

SoftIce ver 4.00 (le versione non è importante)

URL o FTP del programma

http://quequero.members.easyspace.com/progetti.html

Notizie sul programma

Questo secondo programma è un pò più difficilino ma non ci scoraggeremo :)))))) una nota importante, non inserite nella prima casella un nome più lungo di tre caratteri perchè senò il programma va in crash, almeno sul mio pc :(((( Questo dipende dal fatto se avete un K5-6-7 altrimenti su intel non crasha NdQue

Essay


1) Avviamo il programma due.exe, ci chiederà due info per poterlo registrare
2) Inseriamo quello che vogliamo nelle due caselle
3) Clicchiamo il tasto "REGISTER", il programma da un messaggio di errata registrazione

Sappiamo che Windows legge le informazioni da noi inserite nelle caselle con la funzione GETWINDOWTEXTA. Premiamo Ctrl+D e saremo in SoftICE, inseriamo un breakpoint  proprio alla chiamata della funzione  GETWINDOWTEXTA scrivendo BPX    GETWINDOWTEXTA e premendo enter, ora ripremiamo Ctrl+D per ritornare a windows.
Ripetiamo i punti da 1 a 3 ma inserendo 'aaa' nella prima casella e '123' nella seconda. Al momento dell'esecuzione del punto 3 il breakpoint viene eseguito, premiamo il tasto F12 (che serve a ritornare all' istruzione successiva alla chiamata della funzione GETWINDOWTEXTA e ci troveremo il seguente codice

:00401215    mov al, byte ptr [ecx+0040219F]    ; CARICA UNO ALLA VOLTA I CARATTERI
                                                                            ; PER VERIFICARE COSA C'E' NELLA              0040219F IN SOFTICE
                                                                            ; SCRIVETE D 0040219F E PREMETE     ENTER
:0040121B    test eax, eax                                    ; CONTROLLA SE ABBIAMO LETTO     TUTTI I CARATTERI
:0040121D    je 00401279                                   ; SALTA SE ABBIAMO FINITO
:0040121F    xor al, cl                                          ; DA QUI IN POI VENGONO ESEGUITE     DELLE OPERAZIONI
:00401221    mov edi, ecx                                    ; MATEMATICHE SUL CODICE DA NOI     INSERITO
:00401223    mul edi
:00401225    sub al, 25
:00401227    add al, cl
:00401229    xor al, byte ptr [ecx+00402000]
:0040122F    mov edx, 00402193
:00401234    mov ebx, dword ptr [0040219F]
:0040123A    xor ebx, edx
:0040123C    mov edx, 00402183
:00401241    xor ebx, edx
:00401243    add ebx, ecx
:00401245    add al, byte ptr [ecx+00402000]
:0040124B    xor bl, byte ptr [ecx+00402000]
:00401251    shl al, 02
:00401254    ror al, 04
:00401257    shr bl, 03
:0040125A    rol bl, 08
:0040125D    xor bl, al
:0040125F    xor bl, byte ptr [00402002]
:00401265    xor bl, cl
:00401267    rol bl, 08
:0040126A    add bl, al
:0040126C    sub al, 05
:0040126E    sub bl, al
:00401270    mov byte ptr [ecx+0040218F], al            ; INSERISCE IL CODICE CALCOLATO NELLA MEMORIA
:00401276    inc ecx
:00401277    jmp 00401215                                        ; RISALTA ALL'INIZIO

Una volta finata la procedura ci troveremo nel seguente codice:

:00401279    xor ecx, ecx                                            ; AZZERA ECX
:0040127B    mov al, byte ptr [ecx+0040218F]           ; METTE IN AL IL PRIMO NUMERO hex CALCOLATO
                                                                                   ; NELLA RUTINE PRECEDENTE
:00401281    test al, al                                                 ; CONTROLLA SE ABBIAMO FINITO
:00401283    je 00401331                                           ; SALTA SE ABBIAMO FINITO

:00401289    cmp al, 66                                               ; QUESTE RIGHE DI CODICE CONTROLLANO CHE TUTTO
                                                                                    ; SIA CORRETTO SE è COSI' VIENE ESEGUITO IL SALTO
                                                                                    ; JL 00401326

Dunque mica è vero?? mica controllano che il codice sia corretto!!! NdQue
:0040128B    jg 0040131B
:00401291    cmp al, 30
:00401293    jl 00401326

E quindi ci troveremo qua:

:00401326    add al, 18                                               ; SI RIMANE IN QUESTA PROCEDURA FINO A QUANDO
                                                                                   ; CMP AL,30 NON E VERIFICATA E QUINDI SI SALTA
                                                                                   ; ALLA LOCAZIONE 00401299

Ma ancora non l'avete capito? Questa routine serve per trasformare il codice ottenuto in un carattere ASCII valido NdQue
:00401328    cmp al, 30
:0040132A    jl 00401326
:0040132C    jmp 00401299

Vedendo il codice sopra scritto si può dire che viene costruito il codice corretto da inserire nella seconda casella che verrà memorizzato in........ indovinate dove guardate il codice qui sotto riportato

:00401299    inc ecx
:0040129A   mov byte ptr [ecx+004021A7], al            ; ECCO DOVE MEMORIZZA IL CODICE GIUSTO
:004012A0   jmp 0040127B                                        ; ESEGUE IL PROSSIMO CARATTERE

Una volta finito questo loop trovremo nella locazione 004021A7 il codice corretto, voi direte come faccio a esserne così sicuro, guardate qua sotto............

:00401331    xor ecx, ecx
:00401333    mov al, byte ptr [ecx+004021A7]           ; CARICA IN AL IL CONTENUTO DI ECX+004021A7
:00401339    test al, al                                                 ; CONTROLLA CHE AL NON SIA A 00h
:0040133B    je 004012C8                                         ; SALTA SE AL  E' 00h
:0040133D    mov ah, byte ptr [ecx+004021A8]         ; CARICA IN AH IL CONTENUTO DI ECX+004021A8
:00401343    je 004012C8
:00401345    cmp ah, al                                               ; CONFRONTA AL CON AH
:00401347    inc ecx
:00401348    inc edx
:00401349    jne 004012BA                                        ; SALTA SE AL È DIVERSO DA AH

:004012BA    mov byte ptr [ecx+00402173], al           ; MEMORIZZA IL CONTENUTO DI AL
:004012C0    mov byte ptr [ecx+00402174], ah           ; MEMORIZZA IL CONTENUTO DI AH
:004012C6    jmp 00401333                                        ; CONTINUA

Al termine del loop il programma ci manderà alla locazione 004012C8 e qui ne vedremo delle belle :))))))
Nella rutine sottostante il programma legge il codice da noi inserito con quello costruito dal programma vediamo come.....

:004012C8    push 00000019
:004012CA    push 004021A3
:004012CF    push dword ptr [004020DB]
:004012D5    User32!GetWindowTextA
:004012DA    xor ecx, ecx
:004012DC    mov eax, dword ptr [ecx+004021A3]    ; CARICA IN EAX IL CONTENUTO DI 004021A3
:004012E2     mov ebx, dword ptr [ecx+004021A8]    ; CARICA IN EAX IL CONTENUTO DI 004021A8
:004012E8     inc ecx
:004012E9    cmp eax, ebx                                           ; CONFRONTA EAX CON EBX
:004012EB    jne 004012A2                                        ; SALTA SE IL CONFRONTO E' ERRATO

Prima di continuare con il programma diamo un'occhiata alla locazione 004021A3 con il comando D 004021A3....
cosa vedete, e già proprio il numero che voi avete inserito quindi nell'altra locazione di memoria cosa ci sarà......

0030:004021A3 31 32 33 00 12 ...........     123........

ahahahaha il codice corretto da inserire, fate un D 004021A8 e annotate i numeri che vi ho segnato in giallo qui sotto

0030:004021A8 39 32 33 00 00 ...........     923........

Cancellate tutti i breakpoint che avete inserito e premete F5 il programma vi dirà, CHE PIZZA!!!! :)))), che non siete registrati ma non importa perchè ora sapete che al nome aaa corrisponde il codice 923 provate a inserirli e premete REGISTER et voilà!

Vi domanderete che bello ho trovato un codice, ma se volessi cambiare nome da aaa a pio per trovare il suo codice devo rifare tutto questo casino.
No basta creare un keymaker cioè un generatore di codici specifico per questo programma, come fare credo che per chi sa scrivere in assembler è molto semplice basta ripetere nel keymaker la procedura che il programma usa per creare il codice
e il gioco è fatto, per altri linguaggi non saprei che dire :(((((

A dimenticavo la procedura che crea il codice per questo programma l'avete capita qual'è......no guardate i primi tre pezzi di codice all'inizio di tutto :)))))

qua cè il mio KEYMAKER

.code

XOR ECX,ECX                                            ; AZZERA ECX

INIZIO:
CMP ECX,03h                                              ; CONFRONTA ECX 03 QUESTO SERVE SE UNA HA
                                                                      ;  INSERITO DALLA TASTIERA GIA 3 CARATTERI
JZ CODICE                                                  ;  SALTA SE ECX E' = 03
 
MOV AH,01h                                               ; FUNZIONE 01 DELL' INT 21 ASPETTA UN TASTO
INT 21h

INC ECX                                                     ; INCREMENTA ECX
CMP AL,0Dh                                               ; CONTROLLA SE è STATO PREMUTO L'ENTER
MOV BYTE PTR [ECX+01h],AL                ; METTE IL TASTO PREMUTO NELLA LOC. DI MEM ECX+01
JNZ INIZIO                                                  ; SALTA 

MOV AH,02h                                                ; FUNZIONE 02 DELL' INT 21 MOSTRA IL TASTO PREMUTO
MOV DL,AL
INT 21h

CODICE:                                                       ; CI TROVIAMO QUA QUANDO O È STATO PREMUTO ENTER
                                                                      ; O ABBIAMO INSERITO 3 CARATTERI
                                                                      ; DA QUA IN POI È LA STESSA PROCEDURA DEL PROGRAMMA
                                                                      ; CHE E UTILIZZATA PER CALCOLARE IL CODICE
XOR EAX,EAX
INC ECX
MOV BYTE PTR [ECX+01h],00h                ; CARICA DEI NUMERI IN MEMORIA CHE SONO STATI
                                                                      ; UTILIZZATI DAL PROGRAMMA E CHE SERVIRANNO
                                                                      ; PER CRIPTARE I CARATTERI DEL NOME DA NOI 
                                                                      ; INSERITO  
MOV BYTE PTR [00000010],12h
MOV BYTE PTR [00000011],45h
MOV BYTE PTR [00000012],209
MOV BYTE PTR [00000013],255
XOR ECX,ECX
MOV ESI,00000001h

RIPETI:                                                         ; RUTINE CHE ELABORA I CARATTERI DA NOI INSERITI
                                                                     ; E LI CRIPTA COME FA IL PROGRAMMA
MOV AL,[esi+00000001]
TEST EAX,EAX
JZ CALCOLACODICE
XOR AL,CL
MOV EDI,ECX
MUL EDI
SUB AL,25h
ADD AL,CL
XOR AL,BYTE PTR [ECX+00000010]
MOV EDX,00402193h
MOV EBX,DWORD PTR [00000002]
XOR EBX,EDX
MOV EDX,00402183h
XOR EBX,EDX
ADD EBX,ECX
ADD AL,BYTE PTR [ECX+00000010]
XOR BL,BYTE PTR [ECX+00000010]
SHL AL,02h
ROR AL,04h
SHR BL,03h
ROL BL,08h
XOR BL,AL
XOR BL,BYTE PTR [00000012]
XOR BL,CL
ROL BL,08h
ADD BL,AL
SUB AL,05h
SUB BL,AL
MOV BYTE PTR [ECX+00000020],AL
INC ECX
INC ESIi
JMP RIPETI

CALCOLACODICE:
xor eax,eax
MOV BYTE PTR [ECX+00000020],00h
MOV ecx,00000019

CONTINUA:
MOV AL,[ecx+00000001]
TEST EAX,EAX
JZ MOSTRACODICE

RICALCOLA:
add al,18h
cmp al,30h
JL RICALCOLA
mov byte ptr [ecx+00000001],al
INC ecx
JMP CONTINUA                           ***************** QUA FINISCE LA PROCEDURA DI CALCOLO CODICE
                                                        COPIATA PARI PARI DAL PROGRAMMA

MOSTRACODICE:                            ; CI PREPARIAMO ALLA VISUALIZZAZIONE SUL MONITOR DEL CODICE
                                                            ; CALCOLATO DAL PROGRAMMA
mov byte ptr [ecx+00000001],00h
mov ecx,13h

LETTURACODICE:
mov al,byte ptr  [ecx+00000001]          ; CARICA IN AL UN CARATTERE ALLA VOLTA DEL CODICE
cmp al,00h                                            ; CONTROLLA FINE CODICE
jz fine                                                    ; TERMINA IL PROGRAMMA
mov dl,al                                               ; FUNZIONE 02 DELL' INT 21 MOSTRA A VIDEO IL CARATTERE
mov ah,2h
int 21h
inc ecx
jmp LETTURACODICE                      ; PASSA AL PROSSIMO CARATTERE 

FINE:
END
 
 

Spero di essere stato abbastanza chiaro :)))) Unlock

Note finali 

Lo so di non essere bravo con le parole, e alcune volto faccio una grande confusione, e per questo che sto facendo questi corsi per vedere se riesco a migliorare, come tutti del resto, quindi raga portate pazienza :)))))))
 

Disclaimer

LA SOLITA SOLA.......
Vorrei ricordare che l'arte del reversing non è fatta per imbrogliere le case software e non pagare i loro programmi anche perchè i programmatori devono anche pur mangiare no :).

 
UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    ContactMe  CrackMe   Links   
NewBies   News   Forum   Lezioni  
Tools   Tutorial 

UIC