Regvalues e trasformazione

in AutoValueGenerator

Data

by "Evilcry"

 

28/08/2002

UIC's Home Page

Published by Quequero


E questo e' il tuo secondo :PPP

 

....

Home page se presente: www.evilcry.cjb.net
E-mail: [email protected]
Nick, UIN, canale IRC/EFnet frequentato   irc.azzurra.it   #crack-it
 

....

Difficoltà

(x/2)NewBies ()Intermedio ( )Avanzato ( )Master

 

 

Regvalues
Keyfile protection
Written by Evilcry.

Introduzione

Il crackme05 di FusS prende un valore da noi inserito in un registro, lo manipola e lo confronta con un altro valore che dovremo inserire noi.

Tools usati

-IDA...e lo so che è troppo ma mi piace..... :-D (va più che bene anche W32dasm)
-SoftICE

URL o FTP del programma

www.crackmes.de si chiama Crackme05 ed è di FusS

www.tricksoft.net

Notizie sul programma

Ve le ho date sopra le informazioni :P

Essay

Una parte fondamentale del reversing è l' osservazione...quindi avviamo il programma e vediamo che ci dice. Una box ci avvisa che non siamo registrati mah... non vedo text box che si fa??.Disassembliamo ed andiamo a vedere le funzioni importate. Tra le API RegCreateKeyexA e RegQueryValueExA. Bene!! già sappiamo che bisogna lavorare sui registri.Inoltre tra le references relative a RegCreateKeyExA troviamo software\tricksoft\fusS\Crackme05\ , questo è il registro su cui dovremo. Ora settiamo un Bpx RegQueryValueExA, steppando dovremo arrivare più o meno qui:

Possible StringData Ref from Data Obj ->" "

0040119E push 00403127

004011A3 push 0040314B

004011A8 push 004031AB

004011AD push 00000000 Quando questo parametro è NULL possiamo mettere qualsiasi tipo di valore

Possible StringData Ref from Data Obj ->"UserName"

004011AF push 004030E2 ;Puntatore alla stringa "UserName"

004011B4 push dword ptr [00403143]

Reference To: ADVAPI32.RegQueryValueExA, Ord:0165h

004011BA Call 004013B8

Possible StringData Ref from Data Obj ->" "

004011BF push 0040312B

004011C4 push 0040316B

004011C9 push 004031AB

004011CE push 00000000 Come prima, possiamo mettere un tipo di valore a piacimento

Possible StringData Ref from Data Obj ->"MagicValue"

004011D0 push 004030EB Puntatore alla stringa MagicValue

004011D5 push dword ptr [00403143]

Reference To: ADVAPI32.RegQueryValueExA, Ord:0165h

004011DB Call 004013B8

004011E0 push 00000000

Reference To: ADVAPI32.RegCloseKey, Ord:0145h

004011E2 Call 004013AC

004011E7 Call 00401222 la analizzeremo in seguito.

Il codice si spiega da se..., vengono presi i valori delle stringhe: Username e MagicValue. Andiamo crearci queste due stringhe in HKEY_LOCAL_MACHINE\Software\Tricksoft\fusS\Crackme05, il tipo non importa dato che il terzultimo parametro di RegQueryValueExA è NULL , comunque io ho usato string. Ora assegnate a Username un valore a piacimento (che poi verrà manipolato nella call a 004011E7), ed un altro a MagicValue. Riabilitate il breakpoint precedente, e steppate con F10 fin sulla call a 004011E7 poi premete F8 per entrarci.

Referenced by a CALL at Address:

00401222 55 push ebp

00401223 8BEC mov ebp, esp

00401225 684B314000 push 0040314B ;Punta al valore messo in Username

Reference To: KERNEL32.lstrlenA, Ord:02E2h

0040122A E871010000 Call 004013A0 ;Riporta in EAX la lunghezza del nostro valore

0040122F 83F801 cmp eax, 00000001 ;Se è minore o uguale a uno salta a 'Unregistred'

00401232 0F8EC4000000 jle 004012FC

00401238 686B314000 push 0040316B ;Punta al valore che abbiamo messo in 'MagicValue'

Reference To: KERNEL32.lstrlenA, Ord:02E2h

0040123D E85E010000 Call 004013A0

00401242 83F800 cmp eax, 00000000 ;Se è uguale a zero salta a Unregistred

00401245 0F84B1000000 je 004012FC

0040124B 8D054B314000 lea eax, dword ptr [0040314B]

00401251 33C9 xor ecx, ecx

00401253 33DB xor ebx, ebx

Referenced by a (U)nconditional or (C)onditional Jump at Address:

00401255 8A18 mov bl, byte ptr [eax] Sposta in bl l' n-char del valore immesso in Username

00401257 80FB00 cmp bl, 00 Siamo alla fine del valore?

0040125A 740D je 00401269 Salta se siamo alla fine

0040125C 8A7801 mov bh, byte ptr [eax+01] Sposta in bh il char successivo all 'ultimo preso

Forse non sono stato chiaro ora spiego :))Ad esempio il mio nick (evilcry) è 65 76 69 6C 63 72 79, la routine non fa altro che caricare 65 in BL e 76 in BH , al prossimo ciclo metterà 76 in bl e 69 in BH ecc.

0040125F imul ebx, ebx Moltiplica tra loro i 2 chars

00401262 add ecx, ebx somma il risultato ad ECX (che è zero)

00401264 xor ebx, ebx azzera EBX per poterci mettere i prossimi 2 chars

00401266 inc eax incrementa il puntatore al nostro valore

00401267 jmp 00401255 salta all' inizio del ciclo fin quando non arriva all'ultimo char

00401269 add ecx, 00BAB1E5

0040126F xor ebx, ebx

00401271 add ecx, 00000002 somma 2 ad ECX

00401274 inc ebx Aumenta di 1 EBX

00401275 cmp ebx, 00000063 E' uguale a 63??

00401278 jne 00401271 Se è diverso salta a 00401271

Vi consiglio di mettere un bpx 0040127A e poi premere F5 dato che il ciclo è un pò lunghetto

0040127A imul ecx, DEADBEEF Moltiplica ECX per il questo valore costante DEADBEEF

00401280 sub ecx, DEADBEEF Sottrae ad EBX lo stesso valore costante di sopra

00401286 lea ebx, dword ptr [00403048]

0040128C push ecx

0040128D push 0040312F Punta al nick parzialmente "lavorato"

00401292 push 0040318B Locazione momentaneamente vuota (output-buffer usato da wsprintf)

Reference To: USER32.wsprintfA

00401297 Call 0040138E

Se adesso andiamo a vedere 0040318B troveremo il nostro serial quasi completo :))

0040129C add esp, 0000000C

0040129F push 0040318B buffer del ns serial

Reference To: KERNEL32.lstrlenA

004012A4 Call 004013A0 ne viene calcolata la lunghezza

004012A9 lea ebx, dword ptr [0040318B] carica in EBX il puntatore al serial

004012AF add ebx, eax a questo indirizzo gli viene aggiunta la grandezza del serial, in modo che punti alla fine del serial

004012B1 mov byte ptr [ebx], 2D viene messo il valore 2D che corrisponde al trattino '-'

004012B4 inc ebx Il puntatore al seral viene incrementato

Possible stringData Ref from Data Obj ->"[TS]"

004012B5 push 00403132

004012BA push ebx

Reference To: KERNEL32.lstrcpyA

004012BB Call 0040139A copia la stringa fissa "[TS]

Questo pezzo di codice dovrebbe essere abbastanza semplice, in pratica alla fine del serial vengono aggiunti dei caratteri fissi ---> -[TS]

004012C0 push 0040318B Finalmente il serial completo

004012C5 push 0040316B Punta al valore contenuto in MagicValue

Reference To: KERNEL32.lstrcmpA

004012CA Call 00401394 Se le 2 stringhe sono uguali, verrà restituito 0 in EAX

004012CF cmp eax, 00000000

004012D2 jne 004012E8 Se EAX è diverso da 0 salta a 'Unregistred'

Possible stringData Ref from Data Obj ->"Congratulations! Please send me " ->"your solution =)"

004012D4 push 004030F6

004012D9 push dword ptr [0040313F]

Reference To: USER32.SetWindowTextA, Ord:0259h

004012DF Call 00401376

Ora non ci resta che sostrituire il serial al valore della stringa MagicValue.

Auto-ValueGenerator

Dato che il crackme è davvero banale, cerchiamo di modificarlo in una maniera un pò originale, perchè non fare in modo che visualizzi nello status il serial corretto???. La cosa è molto semplice da fare, prima dobbiamo decidere quale API sfruttare per visualizzare il serial, io ho scelto la SetWindowText che si trova a 004012DF (quella dentro la call). se guardiamo a 004012d2 troviamo un salto che bisogna noppare in modo che la SetWindow venga sempre eseguita.Ora sostituiamo i byte relativi al push a 004012D4 con 688B314000 , che corrispondono a push 0040318B :)). Per ultimo ricordatevi che se volete apportare queste modifiche, dovete farvi una copia di backup del crackme, dato che il messaggio di correct serial non comparirà, perchè sostituito dal ns serial :)).

 

Note finali

In fine colgo l' occasione per salutare: Quequero, AndreaGeddon, e4m, Slash, Quake2^AM, Albe, BIGAlex, Ntoskrnl, BIGAlex (che è da un pò che non lo sento :-), Littleluk, FusS . I chan #crack-it #asm #pmode #hackmaniaci .

Disclaimer

Que gentilmente ci ricorda che:

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

Capitoooooooo????? Bhè credo di si ;))))