Simple1 Crackme
From UIC
[[Category:.]]
Soluzione del crackme "Simple 1" di fantoibed
Contents |
| Simple1 Crackme | |
|---|---|
| Author: | [[:Category:.|.]] |
| Email: | . |
| Website: | . |
| Date: | 23/03/2004 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Commenti, se volete |
Introduzione
Solo un crackme.
Tools
IDA Pro v4.17 (insomma un disassemblatore)
masm32 v7.0 (un assemblatore)
Hex Workshop (un editor esadecimale)
Link e Riferimenti
http://quequero.org
Allegato: simple1.zip - il crackme trasformato
Notizie sul programma
Boh... vuole un serial per il vostro nome.
Essay
Apriamo, nome e serial a caso e vediamo la messagebox che ci dice che siamo stupidi (anche se implicitamente). Vabè... 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
.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
Al posto di quelle push della strlen e di tutte le istruzioni che vengono dopo andiamo a piazzare in nostro codice. 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 nulla. Questo perché il crackme contiene delle verifiche sulla lunghezza del serial inserito. Quindi: o inserite 8 lettere a caso nella casella del seriale (vi dico io che deve essere di 8) oppure andiamo a patchare anche il controllo sulla lunghezza:
.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
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 malevole 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.