Regvalues e trasformazione in AutoValueGenerator |
||
Data |
by "Evilcry" |
|
28/08/2002 |
Published by Quequero |
|
|
E questo e' il tuo secondo :PPP |
|
.... |
|
.... |
Difficoltà |
(x/2)NewBies ()Intermedio ( )Avanzato ( )Master |
Introduzione |
Tools usati |
URL o FTP del programma |
www.tricksoft.net
Notizie sul programma |
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 ;))))