Newbies11
(WM_COMMAND e WM_INITDIALOG l'altra faccia della medaglia)

Data

by "Guzura"

 

25/05/2002

UIC's Home Page

Published by Quequero

In un mondo di mistero e magia,

una strega e un valoroso guerriero,

partiranno per un viaggio infinito lo sai,

riusciranno a scoprire i segreti che hai !!!!

Qualche SUO... eventuale commento sul tutorial :)))

Beh questa moda di scrivere nella MIA MODESTISSIMA E PICCOLISSIMA AREA DEDICATA AI MIEI COMMENTI ve la dovete scordare :) oh...manco qui dentro sono libero di dire cio' che voglio??? argh irrispettosi :)

Questo è GURU GURU un magico mondo,

GURU GURU magico e tondo,

GURU GURU è un girotondo e se guardi dentro al cerchio la magia poi riuscirà !!!

MEKE MEKE.

....

E-mail: guz_ura@yahoo.it
Nick: Guzura su #crack-it

Guzura....

Difficoltà

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

 

Dato che a spiegare i trick ci ha pensato benissimo Andreageddon ne approfitto per far vedere come il programmino valuta i messaggi WM_COMMAND e WM_INITDIALOG.


Newbies11
Messaggi
Written by Guzura

Introduzione

Cavolo il mondo è passato già al .NET e il mio Sicstus è ancora a 16bit. :((((

Tools usati

Ida versione a piacere
Sice anche.
Manuale API con i reference di identificazione delle costanti.(TROVATE TUTTE LE COSTANTI IN FORMATO HTML SUL SITO DI ANDREAGEDDON) E' pubblicita' occulta questa? Andre, adesso ti devo uccidere :) NdQue

URL o FTP del programma

UIC.

Notizie sul programma

Questo programma è un crackme.  

Essay

Come al solito la prima cosa da fare è aprire il crackme e vedere se funziona, (non si sa mai).
Sembra una cosa stupida ma almeno vi rendete conto che quello che dovete cercare è una MboxA; quindi subito a decompilare con IDA.
Dovreste trovare subito quello che vi interessa:
 
loc_4012A5: ; CODE XREF: .text:0040128Cj
004012A5 cmp KeyValue, 1Fh
004012AD jnz short Sei_Fuori
004012AF mov eax, [esp+24h]
004012B3 push 40h
004012B5 push offset aRegistration ; "Registration"
004012BA push offset aComplimentiCeL ; "Complimenti ce l'hai fatta!"

Ora bisogna vedere le solite cose: CHI MI SPARA QUA, e CHI MI MANIPOLA IL KEYVALUE.
Partiamo dal secondo cioè andiamo a svelare i trick.
 
CHI MI MANIPOLA IL KEYVALUE
Doppio click su KeyValue e poi CTRL-X per vedere chi referenzia il Key value.
Sono 6 indirizzi: una del CMP che ci interessa e altre 5 dove vengono effettuati degli OR.
Il reverser attento nota subito che se il valore iniziale di KeyValue è 0, gli OR vanno eseguiti tutti per avere alla fine KeyValue=1F.Questo vi dice subito che valore deve uscire dai test sopra i trick.
I trick li trovate ben spiegati nel tutorial di Geddone che è molto chiaro quindi salto.
 
CHI MI SPARA QUA
Dal mio punto di vista questa parte è piu interessante.
Risalendo risalendo si arriva qua.
 
00401320 TavolaAddress     dd offset JumpOK ; DATA XREF: .text:00401197r
00401324                    dd offset Bo
00401328                    dd offset JumpIsZoomed
0040132C                    dd offset JumpShellEx
00401330                    dd offset JumpRegKey
00401334 TabVal             db 0 ; ; DATA XREF: .text:00401191r
00401335                    db 4 ;
00401336                    db 1 ;
00401337                    db 4 ;
 
Questo mi manda su ancora fino a qui.
 

0040117F Table: ; CODE XREF: .text:004010D0j
0040117F add eax, 0FFFFFEEFh
00401184 cmp eax, 0F1h ; DEVE ESSERE 111 WM_COMMAND
00401189 ja JumpRegKey
0040118F xor ecx, ecx
00401191 mov cl, byte ptr ds:TabVal[eax]
00401197 jmp ds:TavolaAddress[ecx*4]

Quello che veramente mi interessa è avere ECX=0 in maniera tale da effettuare il salto in JumpOK (dove si trova il check di correttezza) cioè al primo indirizzo di TavolaAddress.Visto add e il cmp il valore che deve avere EAX è 111 ma uno potrebbe chiedersi da dove arriva quel'111 in eax?

Torante un po su e arrivate belli belli in 4010D0 proprio all'inizio della DlgProcFunction della DialogBox; se avete poca dimestichezza ve ne accorgete vedendo che questo è l'indirizzo passato all'API CreateDialogParamA come 4 parametro alla locazione 401020.

E QUI

DlgProcFunction: ; DATA XREF: _WinMain@16+20o
004010C0 mov eax, [esp+8]; Vediamo che in EAX è caricato l' uMsg che definisce il tipo di messaggio mandato
004010C4 sub esp, 10h

Il primo CMP verifica che il messaggio sia WM_INITDIALOG (che è un messaggio che viene spedito una volta solo al momento della creazione della DialogBox), se non lo è salta alla Tavola degli indirizzi 40117F(esegue Ja Table dove va a verificare che altro tipo di segnale può essere arrivato).

004010C7 cmp eax, 110h ; WM_INITDIALOG
004010CC push ebx
004010CD push ebp
004010CE push esi
004010CF push edi
004010D0 ja Table
004010D6 jz short WM_INITDIALOG ;
004010D8 sub eax, 0Fh
004010DB jz JumpIsZoomed
004010E1 dec eax
004010E2 jz loc_40128E
004010E8
004010E8 JumpRegKey: ; CODE XREF: .text:00401189j
004010E8 ; DATA XREF: .text:00401330o
...
004010F4 push offset aUic ; "UIC"
004010F9 push 80000001h ; HKEY_CURRENT_USER
004010FE call ds:RegOpenKeyExA
00401104 test eax, eax
00401106 jnz short loc_40110F
...
00401118 retn 10h
0040111B ; ---------------------------------------------------------------------------
0040111B
0040111B WM_INITDIALOG: ; CODE XREF: .text:004010D6j
0040111B cmp word_407568, 7CDh ; ANNO A POSTO
00401124 jnz short Valuta_File
00401126 or byte ptr KeyValue, 1
0040112D
0040112D Valuta_File: ; CODE XREF: .text:00401124j
0040112D call sub_401440
...

Quello che veramente ci interessa è l'arrivo di WM_COMMAND che viene attivato ogni qual volta un CONTROLLO (come un bottone premuto) ha qualcosa da notificare.
Da questo si capisce che si eseguira il check di verifica (si salta in JumpOK) quando si preme il tasto "Check" che è appunto un controllo.
Ora voi vi starete chiedendo perchè uno deve farsi una PARANOIA del genere quando non serve a nulla.
I motivi sono 3:
1) non tutti conoscono bene la messaggistica di windows e magari questo puo aiutarli.
2) diventa difficile mettere dei bpx con Sice (se si è alle prime armi) se non ci si accorge di essere dentro una   DlgProcFunction (dato che si brekka ogni millisec senza aver capito il perchè)
3) aveva spiegato tutto GEDDONE molto bene
4) (Se GEDDONE NON CI HA MESSO LE MANI) UNO NOTA QUANTO SIA MACCHINOSO LO SMISTAMENTO DEI MSG DI WIN.
 
Si può fare ancora una considerazione: l'ordine dei trick non è importante a patto di riaprire il crackme non appena finito ma questo è comodo solo per i crackme newbies che difficilmente ti fanno crashare la macchina.
Valutiamo quindi l'ordine di esecuzione dei vari trick.
1)GetSystemTime
2)Se la GetSystemTime è corretta allora si controlla CreateFileA c:\geddon.uic
3)Controllo Sice
4)Controllo RegOpenKey UIC
5)Controllo IsZoomed
 
A ben guardare una cosa particolare è che nonostante nel DeadList sembra essere eseguito prima il controllo su SICE e poi quello sul file geddon.uic in realtà i trick sono invertiti questo perchè l'ordine di esecuzione è questo.
CreateDialogParamA chiama DialogProcFunction con WM_INITDIALOG
Check su geddon.uic
Esco DialogProcFunction esco CreateDialogParamA quindi Controllo SICE, rientro DialogProcFunction che si mette a processare i messaggi utente.
Quello che voglio dire è che in realtà solo il 4 e il 5 trick sono indipendenti dall'esecuzione mentre gli altri vengono eseguiti solo una volta all'inizio.Questo vi forza a riavviare il Crackme.

Note finali

Saluto tutti quelli che mi conoscono.

Disclaimer

Que vuole ricordare le seguenti cose: grazie gu per avermi ricordato che ero io a ricordarvi queste cose :) Que

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.

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