Corso UIC Newbies 02 Pispola
From UIC
Corso UIC Newbies 02 Pispola
Contents |
| Infos | |
|---|---|
| Author: | Pispola |
| Email: | |
| Website: | Home page |
| Date: | 05/11/2000 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | |
Tools
- Guida ai tools
- SoftIce (Valida alternativa: OllyDbg v1.10)
- W32Dasm
- Ultraedit
Link e Riferimenti
Questo è il Corso UIC Newbies n°02 disponibile alla pagina Corsi UIC Newbies
Essay
Ok Vediamo di risolvere insieme questi 3 CrackMe di Phox
CrackMe1
Questo Prg. chiede di togliere La nag che appare all'inizio facendo cosi' apparire direttamente la finestra con il pulsante di About. Eseguiamo il Prg. e vediamo subito la Nag da eliminare ,visto che il prg. si puo' patchare segnamoci su cosa intervenire: Nella parte blu' della finestra troviamo la stringa "CrackMe 1.0 by PhoX" e nel corpo della Nag "Plz registrate this CrackMe...". Siccome per generare una Nag si devono passare dei parametri andremo alla ricerca di queste stringhe e non saremo lontani dalla soluzione! Disassemliamo l'eseguibile con Win32Dasm e ci troviamo in questa posizione:
0040100E push 00402079 // qui' Passiamo la stringa "CrackMe 1.0 by PhoX"
Possible StringData Ref from Data Obj // "Plz registrate this CrackMe..."
00401013 push 0040208D // e qui la stringa "Plz registrate this CrackMe..."
00401018 push dword ptr [00402048]
Dopo aver passato le 2 stringhe della Nag si procede con la Call che genera la Nag (non a caso lascio gli OpCode)
0040101E E8DA010000 Call 004011FD
Perche' noi dovremo agire propio su di essi : i byte che compongono la chiamata li dovremo far diventare nulli (NOP). Riprendiamo il nostro fidatissimo Dasm e posizioniamoci sulla riga :0040101E e leggiamo in basso (sulla barra inferiore) il codice di @offset che sara' 0000061Eh. Ora con un editor esadecimale (io uso ultraedit) andiamo a ricercare il nostro offset che ci portera' nella posizione corretta senza errori, oppure se volete cercate la sequenza di OpCode(quella segnata in blu, attenzione che ce ne potrebbe essere una uguale in un altro punto del programma accertarsi che sia quella giusta) e una volta trovato il punto da patchare sostituite i byte E8 con 90 - DA con 90 - 01 con 90 - 00 con 90 - 00 con 90.
Salvare ed uscire, ora se tutto e' andato a buon fine la Nag dovrebbe essere sparita!
CrackMe2
Qui useremo di + Sice perche' non intendo modificare l'eseguibile ma trovare il giusto seriale Ok Facciamo partire il 2° CrackMe: E schiacciamo sul pulsante (io lascio direttamente Enter Serial Here), e lui ci risponde Wrong Serial. disassembliamo l'eseguibile a andiamo alla ricerca di Wrong Serial e prendiamo in considerazione questo pezzetto di codice:
004011D6 push 00000030
004011D8 push 004020ED // Qui viene passata la stringa "luuuzeeer"
004011DD push 004020FB // Qui viene passata la stringa "Wrong Serial"
004011E2 push dword ptr [00402048]
Che è condizionato dal salto dell'indirizzo :004011B6 andiamo a vedre che dice
004011A7 Call 00401247
004011AC mov dword ptr [004020E9], eax
004011B1 mov esi, eax // Mette il n° dei caratteri del serial in esi
004011B3 cmp esi, 0000000C // Controllo se e' = 12
004011B6 751E jne 004011D6 // Salta se è sbagliato
004011B8 push 00000030
A questo punto basterebbe noppare il jne ed il gioco sarebbe fatto ma noi abbiamo detto che non vogliamo modificare l'eseguibile (Per quistioni di principio le cose degli altri non si toccano!!). Allora vediamo cosa si aspetta il programmillo...Vediamo che il controllo viene fatto subito dopo l'uscita da una call precisamente GetWindowTextLength che fara' questa API ? (vi metto la descrizione in lingua originale speriamo che prima o poi qualcuno faccia i sottotitoli) :-)
The GetWindowTextLength function retrieves the length, in characters, of the specified window's title bar text (if the window has a title bar). If the specified window is a control, the function retrieves the length of the text within the control.
La funzione GetWindowsTextLenght salva la lunghezza in caratteri della barra del titolo di una specificata finestra (se la finestra ha una barra del titolo). Se la finestra specificata è un controllo, la funzione salva la lunghezza del testo che si trova all'interno del controllo, tutto chiaro? NdQue
Allora questa API ci restituiscie il numero di caratteri immessi ,continuando con l'esecuzione passo passo il numero di caratteri viene messo in esi e confrontato con il valore fisso 0000000C =12 se e' uguale salta e ci registra (inutile dire che qualsiasi seriale con 12 caratteri va bene!!!!!)
CrackMe3
Bene sotto col Terzo ,Facciamo partire e vediamo che chiede un seriale inseriamo Pispola e ci appare una finestra di Wrong Code!.
Disassembliamo e vediamo che la MessageBox di fallimento e' condizionata da un sacco di jmp e precisamente :
004011BB,004011C0,004011C6,004011CC,004011D2,004011D8,004011DE,004011E4,004011EA,
004011F0,004011F6,004011FC
Ok vediamo in che parte di codice ci catapultano: (e' buona cosa guardare sempre qualche riga + in su da dove viene effettuato il controllo si vedranno cose interessanti come in questo caso GetWindowText
004011A1 Call 0040126D
004011A6 mov ebx, 00402098 // muove in ebx il nosrto seriale
004011AB push dword ptr [0040204C]
The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied.
allora presumiamo che non sia come il caso di prima che ci interessava solo il n° di caratteri ma anche cosa scriviamo!
004011B1 Call 00401279
004011B6 mov esi, eax muove in esi il n° di caratteri
004011B8 cmp esi, 00000012 Confronta se e' uguale a 12h (18 decimale)
004011BB jne 0040121C altrimenti si arrabbia
ed ora cosa combina al nostro seriale??????(ricordate che e' stato messo in EBX)
// ascii è F
004011C0 jne 0040121C // altrimenti.......
004011C2 cmp byte ptr [ebx+01], 69 // Controlla che il primo carattere +01 (cioè il
// secondo) sia uguale a 69h che ascii è: i
004011C6 jne 0040121C // altrimenti.......
004011C8 cmp byte ptr [ebx+03], 72 // Controlla che il primo carattere +03 (il
// quarto) sia uguale a 72h che ascii è: r
004011CC jne 0040121C // altrimenti.......
004011CE cmp byte ptr [ebx+04], 65 // Controlla che il primo carattere +04
// (quinto) sia uguale a 65h che ascii è: e
004011D2 jne 0040121C // altrimenti.......
004011D4 cmp byte ptr [ebx+06], 57 // Controlla che il primo carattere
// +06 (Settimo) sia uguale a 57h che ascii è: W
004011D8 jne 0040121C // altrimenti.......
004011DA cmp byte ptr [ebx+07], 6F // Controlla che il primo carattere
// +07 (Ottavo)sia uguale a 6Fh che ascii è: o
004011DE jne 0040121C // altrimenti.......
004011E0 cmp byte ptr [ebx+08], 72 // Controlla che il primo carattere
// +08 (Nono) sia uguale a 72h che ascii è: r
004011E4 jne 0040121C // altrimenti.......
004011E6 cmp byte ptr [ebx+0A], 78 // Controlla che il primo carattere
// +0A (Undicesimo) sia uguale a 78h che ascii è: x
004011EA jne 0040121C // altrimenti.......
004011EC cmp byte ptr [ebx+0C], 53 // Controlla che il primo carattere
// +0C (Tredicesimo) sia uguale a 53h che ascii è: S
004011F0 jne 0040121C // altrimenti.......
004011F2 cmp byte ptr [ebx+0D], 75 // Controlla che il primo carattere +0D
// (Quattordicesimo) sia uguale a 75h che ascii è: u
004011F6 jne 0040121C // altrimenti.......
004011F8 cmp byte ptr [ebx+10], 78 // Controlla che il primo carattere +10
// (Diciasettesimo) sia uguale a 78h che ascii è: x
004011FC jne 0040121C // altrimenti.......
004011FE push 00000030
Di conseguenza dovremo inserire un seriale con delle caratteristiche ben precise : N° di caratteri uguale a 18 ,e nelle posizioni sopra elencate quei determinati caratteri controllati una valida chiave potrebbe essere:
Fi,re,Wor,x,Su,,x, oppure FiPreIWorSxPSuOLxA (he he che simbiosi) :-)
Alla Prossima
Note Finali
Note Finali