Soluzione del crackme "simple 1" di fantoibed

Data

by active85k

 

23/03/2004

UIC's Home Page

Published by Quequero


La gente vuol sapere...

Grazie active, hai fatto presto ;p

...Chi noi siamo!!

....

Home page se presente: www.active85k.da.ru
E-mail: [email protected]
active85k #crack-it | #fuckinworld @ Azzurra.org

....

Difficoltà

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

 

Trasformiamo il crackme in un keygen.


Soluzione del crackme "simple 1" di fantoibed
Written by active85k

Allegato: simple1.zip : il crackme trasformato

Introduzione

Boh... ho scaricato il crackme e nel readme c'era scritto che se volevamo potevamo trasformarlo un un keygen. Allora ho detto: << vabbò... >> -.-

Tools usati

IDA Pro v4.17 (insomma un disassemblatore)
masm32 v7.0 (un assemblatore)
Hex Workshop (un editor esadecimale)
Un cervello (potete trovarne uno su www.nonvogliopiùesserestupido.it)

URL o FTP del programma

http://quequero.org

Notizie sul programma

Boh... vuole un serial per il vostro nome. 

Essay

Olè! Apriamo, nome e serial ad capocchiam e vediamo la messagebox che ci dice che siamo stupidi (anche se implicitamente). Vabè... prendiamo ida, disasmiamo il tutto e cerchiamo questa messagebox.

.text:0040157A push [ebp+lpString2] ; nostro serial (dword ptr [ebp-16])
.text:0040157D push [ebp+lpString1] ; serial corretto (dword ptr [ebp-04])
.text:00401580 call ds:lstrcmpA     ; i due seriali sono uguali?
.text:00401586 test eax, eax        ; sinceramente non me ne importa niente!
.text:00401588 jnz short loc_0_401598
.text:0040158A push 40h
.text:0040158C push offset aComplimenti ; "Complimenti!"
.text:00401591 push offset aBravoHaiRisolt ; "Bravo!\nHai risolto il crackme! :-)"
.text:00401596 jmp short loc_0_4015A4
.text:00401598 ; --------------------------------------------------------------------
.text:00401598
.text:00401598 loc_0_401598: ; CODE XREF: sub_0_401487+101 j
.text:00401598 push 30h ; uType
.text:0040159A push offset aMale ; lpCaption
.text:0040159F push offset aCodiceErratoRi ; lpText
.text:004015A4
.text:004015A4 loc_0_4015A4: ; CODE XREF: sub_0_401487+10F j
.text:004015A4 push dword_0_4032E8 ; hWnd
.text:004015AA call ds:MessageBoxA
.text:004015B0
.text:004015B0 loc_0_4015B0: ; CODE XREF: sub_0_401487+5C j
.text:004015B0 ; sub_0_401487+6E j
.text:004015B0 push [ebp+hMem] ; hMem
.text:004015B3 call ds:GlobalUnlock
.text:004015B9 push [ebp+hMem] ; hMem
.text:004015BC call ds:GlobalFree
.text:004015C2 pop edi
.text:004015C3 pop esi
.text:004015C4 pop ebx
.text:004015C5 leave
.text:004015C6 retn

Ok, ok... ci siamo capiti... al posto di quelle push della strlen e di tutte le istruzioni che vengono dopo andiamo a piazzare in nostro codice. Solitamente si aggiunge una nuova sezione all'eseguibile, mettendo un jmp al punto giusto ecc... ecc... ci ho provato ma il crackme reagisce male. Stessa cosa se aggiungo una SetWindowText. Sinceramente non mi sn posto il problema in quanto ho notato che nella import table c'è una SendMessage. Allora ho detto: perché non possiamo usare quella per settare il testo al nostro editbox? Vabè... a dopo. Se facciamo un po' di attenzione notiamo che fantoibed ha una pazienza che davvero pochi hanno. Ovvero si è creato tutti i componenti, window e editbox manualmente con le CreateWindowEx. Per settare il testo ci servirà prima o poi l'handle del secondo edit giusto? Beh... basta andare a vedere che cosa viene usato al momento del prelevamento del nostro seriale. E precisamente:

.text:004014C9 push 1Eh ; nMaxCount
.text:004014CB push eax ; lpString
.text:004014CC push dword_0_4032E4 ; hWnd
.text:004014D2 call ebx ; GetWindowTextA

La DWORD colorata in verde è il punto in cui c'è memorizzato l'handle del secondo edit (quindi 004032E4). Rimane soltanto la SendMessage. Come fare per usarla? Beh... basta vedere come è stata usata in precedenza dal crackme:

.text:00401340 mov esi, ds:SendMessageA

Tradotto in numeri diventa:

mov esi, 00402028

Ok. Abbiamo tutto: il serial corretto, l'handle dell'edit e la SendMessage. Mano al macro assembler e scriviamo il nostro codice:

.386
.model flat, stdcall
option casemap: none
include \masm32\include\windows.inc

.code
main:
        push dword ptr [ebp-04]    ; il seriale corretto (lParam)
       
push 0                     ; (wParam)
       
push WM_SETTEXT            ; (Messaggio per la SendMessage)

       
mov eax, 004032E4h
        mov eax, [eax]
        push eax                   ; (l'handle della nostra editbox)

       
mov eax, 00402028h
        call dword ptr [eax]       ; (Chiamata a SendMessage)

       
pop edi
        pop esi
        pop ebx
        leave
        ret
end main

Assembliamo il tutto. Torniamo al crackme: il virtual address che ci interessa era 0040157A. Il raw address corrispondente è 77A. Copia & incolla per 1B bytes dall'assemblato al crackme finale. Ora... praticamente tutto è andato bene... funziona tutto... però ancora rimane un particolare. Che se scrivete il vostro nickname e premete invio non succede un'emerita mazza. Questo perché il crackme contiene delle verifiche sulla lunghezza del serial inserito. Quindi: o inserite 8 lettere a capocchia nella casella del seriale (vi dico io che deve essere di 8) oppure andiamo a patchare anche il controllo sulla lunghezza. Per essere più rompiballe:

.text:004014EC push eax ; lpString
.text:004014ED mov [ebp+var_10], eax
.text:004014F0 call ebx ; lstrlenA
.text:004014F2 cmp eax, 8
.text:004014F5 jnz loc_0_4015B0        ; dobbiamo noppare questo jumpus

Quel salto si trova esattamente a 6F5 nel file e occupa la bellezza di sei bytes. Una volta noppato quello, tutto funziona. Ricordate solo che il nome deve essere almeno di 4 caratteri.

Mattia Buccarella (active85k)

Note finali

Questo campo non è necessario... lo dice pure il que! :D

Disclaimer

Qui inserirete con questo carattere il vostro piccolo disclaimer, non è obbligatorio però è meglio per voi se c'è. Dovete scrivere qualcosa di simile a: 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.