Multi Clipboard ver. 9.09.01 |
||
18-09-1999 |
by "Sator SSH" |
|
Published by Quequero |
||
We work in the dark.We do what we can.We give what we have.Our doubt is our passion, | Do il mio benevenuto a Sator per essere entrato nella nostra comunità, vi presento un suo tutorial non molto impegnativo ma che avvalora la tesi di +ORC "in ogni programma ci sono SEMPRE più vie di attacco" |
and our passion is our task.The rest is the madness of
art. Henry James. |
UIC's form |
|
UIC's form |
Difficoltà |
(X)NewBies ( )Intermedio ( )Avanzato ( )Master |
Come riuscire a tirarsi fuori dai guai,e far funzionare un programma,anche quando non si riesce a trovare il giusto RegCode o la corretta password !!! :-)))
Introduzione |
Tools usati |
URL o FTP del programma |
Il programma lo si può reperire al seguento indirizzo: http://www.ElectraSoft.com/
Notizie sul programma |
Essay |
DUE DIFFERENTI MODI DI CRACKARE UN PROGRAMMA
REVERSING E PATCHING
Ok gente
.eccomi qua alle prese con il mio primo tutorial. Scusatemi se come
didattica farò schifo,cercherò di essere il più chiaro possibile !
Dunque, il nostro obiettivo è quello di rendere completamente funzionanti i vari
programmi shareware, colmi di limitazioni nell'uso, nagscreens, funzioni disabilitate e
chi più ne ha più ne metta. Non vogliamo comunque danneggiare nessuno, sia ben chiaro,
ma riuscire piuttosto a capire come funzionano le varie tecniche di protezione all'interno
del codice programma.E' giusto un divertimento e una bonaria e sana sfida con chi ha
scritto il programma.
In questo primo tutorial vedremo come trovare il giusto seriale di un programma per la
registrazione dello stesso e in alternativa come patcharlo per renderlo completamente
funzionante pur senza immettere il codice.Alla fine, ma sarà oggetto di un altro
tutorial, scrivere un KeyMaker in assembly, sempre per lo stesso programma, per cui è
scontato che chi si accinge a leggere ciò abbia sufficiente dimistichezza con debugger,
disassemblatori, compilatori, etc
Ho scelto, giusto per iniziare, qualcosina di facile facile!!! Bando comunque alle
ciance
.si parte !!!
CODICE DI REGISTRAZIONE
Ordunque, si va ad iniziare .lanciamo il programma e ci apparirà una DialogBox in cui inserire il nome(min.3 caratteri),nel mio caso ho immesso Sator SSH (che fantasia !!!), clickiamo su 'Apply' e vien fuori un'altra finestra che ci chiede di immettere il codice di registrazione; inseriamo quello che ci pare, ad esempio 5555555555.Entriamo in SoftIce con Ctrl+D (ovvio no?) e settiamo un bel bpx su GetDlgItemTextA.
Piccola digressione:
La funzione GetDlgItemTextA ritorna la stringa da noi inserita,associata ad un
identificatore di controllo in una DialogBox.
La struttura è la seguente:
UINT GetDlgItemText // Il nome della funzione
HWND hDlg, // Handle della DialogBox
int nIDDlgItem, // Identificatore di controllo
LPTSTR lpString, // Indirizzo del buffer per il testo
int MaxCount, // Massima lunghezza della stringa inserita
A questo punto F5 per uscire dal debugger e di nuovo click su 'Apply'. Via, di nuovo in
SoftIce: adesso premiamo F12 per posizionarsi nel punto in cui è stata chiamata la
funzione che abbiamo brekkato. Questa parte di codice controlla e manipola la stringa del
nome da noi inserita
.steppando vedrete infatti a 405AF9 un cmp ecx,03 (avete capito
vero a che serve quest'istruzione no ?). Dando un'occhiata a EAX vi accorgerete, inoltre,
che contiene il numero in hex dei caratteri che compongono il nome (spazi
compresi).Tuttavia, almeno per questo programma questa parte di codice ci interessa
relativamente poco, per cui di nuovo F5 ed F12.Questa volta siamo al posto giusto al
momento giusto, infatti in EAX notate il numero sempre in hex dei caratteri che compongono
il RegCode, nel mio caso A che corrisponde in decimale al numero 10
ho inserito
infatti dieci 5. Bene, bene, ma in quale oscuro angolo della memoria è stato confinato il
nostro '5555555555'?Fate un bel D EDI e nella Data Window di SoftIce non vedrete
niente
ORRORE !!!!(scherzo). Portatevi con il cursore nella finestra Data e scrollate
verso l'alto con il tasto cursore.Magia!Vediamo il nostro beneamato codice che fasullo per
quanto mai fa bella mostra di sé. Annotiamoci l'indirizzo che in questo caso è 443C68.
Adesso fate un BC * e settate un BPR 443C68 443C68+A R, (A è il numero dei caratteri che
compongono il codice ed R l'istruzione che indica a SoftIce di bloccare l'esecuzione del
programma quando va a leggere nell'intervallo degli indirizzi da noi specificato). Ok,
premete F5 e steppate fino a che non incontrerete questa porzione di codice:
:00405BB9 call 004076A0
:00405BBE mov edi, 00440DA0 <
---- Qui
:00405BC3 or ecx, FFFFFFFF
:00405BC6 xor eax, eax
:00405BC8 add esp, 00000004
:00405BCB repnz
:00405BCC scasb
:00405BCD not ecx
:00405BCF dec ecx
:00405BD0 mov edi, 00440DA0 <
---- Qui
:00405BD5 mov esi, 00443C68 <
---- Qui
Steppate fino a 405BD5. Ora fate un D EDI e vedrete il codice esatto che corrisponde al
nostro nome, nel mio caso è 30353738363A. In ESI c'è quello fasullo che a noi non
interessa più. Giacchè ci siete fate un D 496D60 e vedrete il nome con il giusto seriale
in bella vista. Non mi chiedete come ho fatto ad arrivarci, tanto non ve lo dico.
Qualcosina dovete pur farla voi..vero? :-)
Orbene, bc * ed F5 per uscire lindi e puliti da SoftIce, rilanciamo il programma,
mettiamoci il giusto seriale e miracolo della scienza e tecnica siamo diventati degli
utenti registrati a tutti gli effetti.
Tuttavia,questo è uno dei tanti modi per la ricerca del seriale
.che io sappia vi
sono almeno altri 3 o 4 metodi per raggiungere lo stesso scopo.
Chiaramente questo è stato un giochetto che non ha richiesto un granchè di abilità .tenete presente che i seriali o le password in genere sono criptati e codificati con algoritmi inventati dagli autori del software e che raramente sono in chiaro come in questo esempio. Vedremo, comunque più in la qualche programma che fa uso di queste tecniche.
PATCH
Allora
..siccome siamo dei masochisti, dimentichiamoci del RegCode e vediamo come
fare per eliminare i vari NagScreens che la versione shareware del programma gentilmente
ci offre. Ovverosia come patchare il programma per renderlo bello, pulito e funzionante al
100%.
Cancelliamo innanzitutto il file Mltclip.ini in C:\Windows.Lanciamo il programma e
inseriamo nella finestrella della solita DialogBox il nome (sempre Sator SSH
.uffa
che pa[[e !!!). Clickiamo su 'Apply' e viene fuori il 1° NagScreen che ci chiede di
immettere il regcode
(lo so,siete tentati a inserirlo, ma resistete!), click su 'Get
Registration Code from Electra Soft Later' e via nel 2° NagScreen, aspettate che si
illumini il tasto 'Register Later' e poi di nuovo click, siamo nel 3° NagScreen(e che
cavolo, basta no !!!), clickiamo su 'OK' e finalmente la finestra del nostro beneamato
programma si presenta ai nostri inviperiti occhi. :-)
Bene, cancelliamo di nuovo il file Mltclip.ini e rilanciamo il programma. Inserite un nome
(io suggerirei Sator SSH, ehehehe
.non mi uccidete !!!). Ctrl+D per entrare in
Softice, settiamo un bpx HMEMCPY,F5 per uscire e click su 'Apply' per rientrare nel
debugger. Disabilitiamo il BPX con BC* e premiamo 9 volte F12 per raggiungere il nostro
caro programma. Fatto? Ok
.andiamo avanti. Steppate con F10 fino a quando una call vi
butterà fuori dal debugger. (Dovete steppare un bel po', anche attraverso il Kernel,User
e di nuovo Kernel per raggiungere questa call).
Comparirà a questo punto il 1° NagScreen, clickate sui vari bottoni di questo e degli
altri Nags per chiudere il programma. Come per magia,ricomparirà il Softice nel punto in
cui vi ha buttato brutalmente fuori. Andate in Code Window e qualche riga più su rispetto
a quella illuminata e precisamente a 4021B9 troverete la call che vi ha scaraventato fuori
dal debugger (che cattivona !!!). A questo punto sarete tentati di nopparla, vedrete però
che il programma non funzionerà più. Allora BPX a questo indirizzo andandoci sopra con
il cursore e clickando due volte. Uscite con F5 dal debugger, chiudete e rilanciate il
programma, vi troverete, logicamente, di nuovo in questa call
disabilitate il BPX
(ormai sapete come si fa) ed entrateci dentro con F8.Steppate con F10 e vi ritroverete di
nuovo ad essere buttati fuori da una call a 4074CB (la sola e unica responsabile del 1°
NagScreen).
Siccome ve l'ho detto io evitate di stepparci sopra e date uno sguardo al disassemblato
qui sotto:
Jump at Address:
|:0040747F(C)
|
:0040748C mov ecx, dword ptr [0043A334]
:00407492 and ecx, 0000001F <----
1Fh=31d (giorni di prova del programma,no?)
:00407495 cmp cl, 1F <----
Confronta la parte bassa di ecx con il valore 1Fh
:00407498 je 004074A3 <----
Esegue il salto (Nags!)
:0040749A cmp eax, 00000001 <----
Se eax=0 il programma esegue il salto,se eax=1 continua
:0040749D jne 004075C6 <----
Esegue il salto (No Nags!)
Jump at Address:
|:00407498(C)
|
:004074A3 ............................
......................................
:004074C6 ............................
:004074CB call 00421F45 <----
1°NagScreen
:004074D0 cmp eax, 00000001 <----
Se eax=1 il programma esegue il salto,altrimenti continua
:004074D3 je 0040755F <----
Qui
:004074D9 mov ecx, 00440B10
:004074DE call 00421F45 <----
2°e 3°Nagscreen
:004074E3 ............................
......................................
:00407519 ............................
Come vedete la routine che contiene la call responsabile del 1° NagScreen è chiamata
da un salto condizionato a 407498.Da persone intelligenti non ci rimarebbe altro che
invertirlo in jne
.non fatelo perché dopo i 30gg. di prova del programma, il flag
(sapete cos'è vero?), cambiando di stato condizionerebbe il jmp da noi modificato, e ci
ritroveremo , di nuovo, sempre e comunque nella stramaledetta routine (vedi dopo). L'unica
cosa da fare è noppare con 5 nop la call a 4074CB.
Rilanciamo il programma e gioite gioite il 1° NagScreen non c'è più. Una volta noppata
la call metteteci ugualmente un bpx a 4074CB e premete F5 per uscire dal debugger.
Chiudete e rilanciate il programma.Siete di nuovo in Softice,steppate e vi ritroverete ad
essere buttati fuori da un'altra call a 4074DE (responsabile del 2°e 3° NagScreen).
Sarebbe stato comunque sufficiente dare uno sguardo al disassemblato di cui sopra, per
capire quale era la call che chiamava gli altri Nags (sempre la stessa comunque!). In ogni
caso un po' di esercizio non guasta mai.
Adesso per eliminare questo Nag possiamo agire in 2 modi diversi:
1° Modificare a 4074D3 il salto condizionato da je in jne
2° Noppare a 4074DE la call con i soliti 5 Nop
Comunque sia, a voi la scelta tra i due modi.
Vediamo adesso come ottenere lo stesso risultato, patchando il programma in maniera più
elegante (forse :-) !!! Quanto commentato nel disassemblato, di cui sopra, è vero
solo per i primi 31gg.Ma dopo, cosa succede? Vediamo.......
ENTRO I 31 GIORNI : Modifichiamo a 407498 il je in jne,in modo tale che il programma non esegua il salto.Diamo uno sguardo ai registri e vediamo che EAX è uguale a 0, per cui via libera al salto a 40749D. Ci appare così la finestra principale del programma senza passare attraverso i Nags.Semplice vero?
DOPO I 31 GIORNI : Lanciamo il programma e AAARRRGGGHHH !!!!!...di nuovo i Nags. Come mai? Dunque, se vedete nei registri, ora EAX vale 1 (perchè superati i 30gg.), per cui non si ha più il salto a 40749D e il programma continua normalmente con i Nags.Allora cambiamo jne in je direte voi......eh no, perchè avrete il problema opposto e uguale entro i 31 giorni, in quanto modificato anche il salto condizionato a 407498.Una delle tante soluzioni è quella di metterci un salto incondizionato, modificando jne 4075C6 in jmp 4075C6 : così facendo, comunque vadano le cose, avremo sempre il nostro bel programma privo dei simpatici NagScreens e completamente funzionante....e mo' basta !!! ;-).
A questo punto rimane ancora una sola cosa da fare;lanciate il programma (tutt'altra
cosa senza i NagScreens, vero?) e vi accorgerete in alto a destra sotto la barra del
titolo di un bottone con su scritto 'Unregistered User - Nome'.
Disassemblate il programma con Wdasm, andate in Refs e clikkate su 'String Data
References', cercate la stringa 'Unregistered User' e clickateci sopra due volte. Vi
ritroverete nella porzione di codice che riporto fedelmente qui sotto:
Jump at Address:
|:00407E15(C)
|
:00407E31 mov eax, dword ptr [00499730]
:00407E36 push 00496D60
:00407E3B cmp eax, 00000001 <----
Se eax=0 il programma esegue il salto,se eax=1 continua
:00407E3E jne 00407E47 <----
Qui
* Possible StringData Ref from Data Obj
->"Registered to - %s"
|
:00407E40 push 0043BA20
:00407E45 jmp 00407E4C
Jump at Address:
|:00407E3E(C)
|
* Possible StringData Ref from Data Obj
->"Unregistered user - %s"
|
:00407E47 push 0043BA08
Cosa facciamo allora? Semplice: non facciamo eseguire il salto a 407E3E (jne diventa
je) che ci porta alla stringa 'Unregistered User', di modo che, il programma proseguendo
con le successive istruzioni ci regala il bottoncino con la scritta 'Registered to -
Nome'.
Alleluia, alleluia anche questa è fatta!!! Adesso, infatti, rilanciando il programma,
comparirà solo la DialogBox iniziale: immettiamo il nome e......sorpresa !!! Siamo utenti
registrati pur non avendo inserito il Codice di Registrazione.
Ora per rendere effettive e permanenti le modifiche, disassemblate di nuovo il programma, andate agli indirizzi dove ci sono le istruzioni da modificare e annotatevi i giusti offset dell'eseguibile (Mltclip.exe).Aprite il file con un HexEditor e andate tranquillamente a modificare tutto il mondo!!!!! Se poi siete dei birbantelli, createvi pure un sano e robusto file di crack con i diversi PatchMaker, che troverete sicuramente in giro per la rete, o addirittura se avete tempo e pazienza scrivetene direttamente uno voi stessi.
Tenete presente che anche in questo caso le vie per PATCHARE sono infinite (come
quelle del Signore). Questo da me descritto è uno dei tanti, e lasciatemelo dire, forse
uno dei modi meno comodi per raggiungere lo scopo.
Ho scelto comunque questo, in quanto più ricco di nozioni circa l'uso del debugger
e
credetemi, più lo si impara ad usare in tutta la sua potenza, più facile risulterà per
voi reversare e patchare programmi protetti nei più svariati modi.
Note finali |
Desidero ringraziare innanzitutto Quequero che mi ha permesso di pubblicare questo tutorial e tutti quelli che con i loro suggerimenti e consigli mi hanno aiutato nell'apprendere le nozioni basilari del Cracking. Un caloroso saluto e ringraziamento va all'amico di tante notti insonni GR!SU' (che ormai è diventato più bravo di me) e a tutti gli altri cracker più anziani è più in gamba di me:
+ORC, Xoanon, ED!SON, Scacco, Cyborg, CbD, Keyboard Caper, Fravia e naturalmente
anche a tutti quelli che involontariamente ho dimenticato di menzionare.
Disclaimer |
Il presente documento è stato scritto solo ed esclusivamente per un uso puramente
didattico, al fine di comprendere meglio alcune tecniche di protezione all'interno del
codice programma.Pertanto non mi assumo nessunissima responsabilità circa l'uso illecito
o non corretto,da parte di terzi,di questo tutorial,né tantomeno per eventuali danni che
l'applicazione di quanto scritto, potrebbe arrecare ad eventuali software.
Se siete interessati ad un programma compratelo e registratelo !!!
Ciao a tutti e alla prossima . :-) !!!
Home
Anonimato Assembly
ContactMe CrackMe Links
NewBies News Forum Lezioni
Tools Tutorial