| |
Tutorial lezione 1 UIC
(crackare il programma) |
|
30/08/1999 |
by "syscalo" |
|
|
UIC's Home Page |
Published by Quequero |
Good morning Window$ user,what do you want to reinstall today?
|
- Il tutorial è ottimo, tranne un piccolo pseudo-errore, diciamo che è solo una
svista, bravo syscalo anche se non hai utilizzato la via più breve
|
Reverse for your knowledge not for your pockets |
| UIC's form |
E-mail: syscalo@tiscalinet.it
|
UIC's form |
Difficoltà
|
(X)NewBies
( )Intermedio ( )Avanzato ( )Master |
|
Soluzione lezione #1 di UIC. Tutorial su come fregare la protezione di questo
programma. (non sono 2 righe ma fa niente;)
- Tutorial lezione 1 UIC
Written by syscalo
- Il sistema di protezione di questo programma non è difficile da fregare! Basta
individuare quelle poche istruzioni che determinano la giusta strada. E' invece un po'
più difficile comprendere il meccanismo di creazione del seriale, ma ci si può arrivare.
- SoftIce (credo sia sufficiente il nome;)
- http://quequero.members.easyspace.com/prj/corsoprimo.html
- Purtroppo ho potuto dedicare solo mezza giornata a questo programma (lo so che per molti
è anche troppo;) quindi non sono ancora riuscito a ricavare il seriale corretto; sono
sulla buona strada ma ho ancora qualche problema.
- Bhe, forse è il caso di iniziare...
- Ovviamente softice deve essere già attivo sul vostro sistema, se no dove volete andare
;) La funzione usata dal programma per acquisire nome e seriale è GetWindowTextA. Per
sgamarla non è necessario provare le tre consigliate da Quequero, basta fare l'anteprima
dell'exe (una cosa utile di window$ ;). Syscalo ha ragione, questa
tecnica può però essere usata solo in caso di programmi piccoli dal momento che un
programma già di 100kb è probabile che le usi tutte e tre NdQue Impostiamo un
break sulla funzione: bpx GetWindowTextA, avviamo il programma, inseriamo nome e seriale e
premiamo il pulsante. Ecco softice! Premere F11 per uscire dalla funzione e siamo subito
nel nostro programma. Ora si puo vedere che poche istruzioni dopo c'è la chiamata per
leggere il seriale. Bene, premiamo F12 per fermarci proprio al ritorno da quest'ultima. Si
può notare che prima delle chiamate viene impostato il # max di caratteri da leggere a 8
(istr. PUSH 08) quindi se ne scrivete di più non verranno nemmeno letti. Nei parametri
passati vi sono anche gli indirizzi dove vengono memorizzati i dati: PUSH 00402165 (ind.
nome) PUSH 00402169 (ind. serial); già da qui si può capire che del nome verranno
conservati solo 4 chr (sta per caratteri:) perchè ai successivi si sovrappongono quelli
del seriale. Per vedere come sono memorizzati i dati dopo la lettura basta dare il
comando: d 00402165. Inoltre dopo ognuna delle due funzioni si può vedere in EAX il # di
chr effettivamente letti.
- Passiamo al codice puro:
- Troviamo le seguenti istruzioni
- MOV EBX,00402169 ind. inizio seriale
- MOV EDX,EAX EAX contiene il # chr letti dal seriale
- XOR ECX,ECX azzera ECX
- (1)
- MOV AL,[ECX+00402165] carica in AL il cod. ASCII dal primo chr del
nome
- ADD AL,12 |
- XOR AL,CL |algoritmo che calcola il valore di confronto
- ADD AL,15 |
- ADD AL,02 |
- MOV EBX,00402169 (inutile) Semi-Errore:
questo pezzo di codice non è assolutamente inutile, non potete considerarlo come junk,
però potete considerare junk la stessa istruzione all'indirizzo 401221, infatti è più
logico muovere l'offset di un buffer in un registro appena prima dell'operazione che lo
userebbe piuttosto che alcune righe sopra, mi spiego meglio supponiamo di avere questa
routine:
-
- CALL GetWindowTextA, EditHWnd, offset Buffer, 20
- mov eax, offset Buffer
- CALL GetWindowTextA, Edit2HWnd, offset Altro_Buffer, 20
- mov ebx, dword ptr[eax]
-
- ciò che succede è che dopo la prima chiama a GetWindowTextA
sposto l'offset di ciò che leggo dalla prima casella in EAX, poi dopo la seconda chiamata
muovo ciò che contiene eax in ebx, il problema è che il contenuto di eax è stato
sovrascritto dopo la seconda chiamata e quindi non ho più nulla, conviene quindi spostare
l'offset del buffer sempre prima dell'operazione che si deve eseguire, innanzitutto
perchè il contenuto nelle righe di codice successive rischierebbe di essere cambiato e
poi il registro ci potrebbe sempre servire, questa è una piccolissima trappola che ho
inserito e syscalo ci è cascato, non è grave però dovete starci attenti perchè mi è
capitato varie volte di trovare trappole di questo tipo nei programmi NdQue
-
- MOV AH,[ECX+EBX] carica in AH il cod. ASCII dal primo chr del
seriale
- CMP AL,AH confronta cod. chr nome elaborato con cod chr seriale
- (×) JNZ 00401311 se sono diversi
visualizza msg di errore
- INC ECX conteggio # confronti
- INC EAX
- CMP ECX,03 |esegue le istr precedenti per tre volte
- JNZ 0040122A |salta a (1)
- -----
- qui è presente una serie di confronti e salti inutili; proseguire
con F10 fino al seguente codice
- -----
- (2)
- MOV AL,[ECX+00402165] carica in AL cod ASCII dal primo chr del
seriale
- XOR AL,16 |
- ADD AL,45 |elabora il chr
- ADD AL,CL |
- MOV BL,[ECX+00402169] carica in BL cod ASCII dal quarto chr del
seriale
- CMP AL,BL confronta cod ASCII chr seriale elaborato con chr dal
quarto del seriale
- (×) JNZ 00401311 se sono diversi
visualizza msg di errore
- INC ECX conteggio chr
- CMP ECX,08 |esegue le istr precedenti fino a quando ECX=8
- JNZ 004012A9 |salta a (2)
- -----
- qui è presente una serie di confronti e salti inutili; proseguire
con F10 fino al seguente codice
- -----
- (×) CALL 00401351 chiama una funzione
che esegue ancora dei controlli sul nome e sul seriale
- CMP AL,01 controlla in valore ritornato dalla funzione
- (ø) JZ 00401338 se il valore
ritornato è 1 visualizza il msg codice ESATTO
ora tutto quello che c'è da fare è NOPpare le istuzioni indicate con (×) con il comando "e indirizzo_istr" e scrivendo
sequenze di 90 al posto dell'opcode dell'istruzione.
- Va inoltre modificato il salto indicato con (ø) in un JMP
tramite il comando "e indirizzo_istr" e scrivendo EB al posto di 74
- Ora potete inserire qualsiasi nome e seriale che il programma si congratulerà sempre
con voi ;)
LE MODIFICHE APPORTATE DA SOFTICE NON SONO PIU' VALIDE SE RIAVVIATE IL PROGRAMMA,
DOVRETE QUINDI RIPETERE TUTTO :-{ RICORDATEVELO!
Insomma bene o male siamo giunti alla fine!!! Mi scuso per il brutto modo in cui si
presenta il codice del programma ma il potentissimo stumento che ho utilizzato per
modificare la pagina (notepad!) non mi permetteva di fare di meglio (visto che tutto il
codice HTML che conosco l'ho imparato da questa pagina ;). Spero di essere stato il più
comprensibile possibile, tenuto conto che è il primo tutorial che scrivo e visto che ho
iniziato gli studi alla UIC da un paio di settimane. Il crack per me, prima d'ora, era
solo il programma che permetteva di usare software gratis, ora è diventato una sfida
personale per migliorare sempre e testare le proprie capacità.
Ora è giunto il momento dei ringraziamenti. Per questa prima volta voglio farne uno
soltanto, ma credo che sarà il più importante che potrò mai fare:
GRAZIE QUEQUERO
(sa un po' di leccaculo o è una mia impressione;) Gisuto un po'
:)) NdQue-questa nota me la sono aggiunta da solo, non è di Quequero-
-×××Ciao a tutti×××-
- 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.
Capitoooooooo????? Bhè credo di si ;))))
Nota di syscalo: ho lasciato volutamente il disclaimer suggerito da Quequero (non per
pigrizia;) perchè credo chiarisca molto bene lo scopo della UIC (e pari molto bene il
culo;)
-