Simple1 Crackme
From UIC
Soluzione del crackme "Simple 1" di fantoibed
Contents |
| Infos | |
|---|---|
| Author: | Active85k |
| Email: | active85k@hotmail.com |
| Website: | www.active85k.da.ru |
| Date: | 23/03/2004 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Commenti, se volete |
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
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)
Link e Riferimenti
http://quequero.org
Allegato: simple1.zip - il crackme trasformato
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: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: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:
Tradotto in numeri diventa:
Ok. Abbiamo tutto: il serial corretto, l'handle dell'edit e la SendMessage. Mano al macro assembler e scriviamo il nostro codice:
.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: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.
Note Finali
Questo campo non è necessario... lo dice pure il que! :D
Disclaimer
I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.
Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.