Pixel3D
From UIC
Pixel 3D v1.07
Contents |
| Infos | |
|---|---|
| Author: | Pincopall |
| Email: | Pincopall90@hotmail.com |
| Website: | http://pincopall.altervista.org |
| Date: | 17/07/2000 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Que: Pinco, mi hai presentato un form che era un puttanaio :) cmq non fa niente, il tute è stato chiaro, niente di eccessivamente difficile, ma ora basta con i target facili, alziamo un po' il nostro livello e cimentiamoci con qualcosa di più difficile :) |
Introduzione
Questo programma è stato il primo che ho "cercato" di reversare o di crakkare nel "lontano" Gennaio 1999 quando ancora non sapevo niente della nobile arte (non è che ora sia un mago eh :-)). Ho dunque deciso di cimentarmici ed ecco qua, l'ho spuntata io.
Tools
Link e Riferimenti
Beh io ho trovato la versione trial a 30 gg sulla rivista "Il mio computer" del Giugno 1997, ahò non è pubblicità occulta eh!!,comunque se lo volete ordinare dovete chiamare il numero 612-702-0811, U.S. :-)
Essay
Dunque si parte, lanciamo il programma, premiamo help e poi "purchase Pixel 3D..". A questo punto compare il box in cui inserire il nostro seriale che viene calcolato secondo il codice sovrastante il box.
Dunque io inserisco un numero a caso ,per esempio "22442244", clikko ok e mi compare, ovviamente, la beggar-off dicendomi : "you have entered an incorrect activation code" bene, fai il furbo eh? e allora io apro WDasm e ,dopo aver premuto su String Data Reference (dal menu refs) cerco tal frase.
Una volta trovata la stringa,per far prima potevo anche cercarla con "Find Text", ci clikko sopra e mi appare questa parte di codice:
0041946F(C) // dunque è qui il salto che ci fa andare al messaggio di errore!
0041966D cmp eax, 00000002 // confronta eax con 2 e,se non è uguale salta
00419670 752C jne 0041969E // alla beggar off "The purchasing process has been cancelled"
Possible StringData Ref from Data Obj ->"You have entered an incorrect "
->"activation code."
|
00419672 push 004EEA94
00419677 lea eax, dword ptr [ebp+FFFFF9E0]
0041967D push eax
0041967E call 004DFAC0
00419683 add esp, 00000008
00419686 lea eax, dword ptr [ebp+FFFFF9E0]
0041968C push eax
0041968D call 0046D5D0
00419692 add esp, 00000004
00419695 xor eax, eax // azzera il valore di eax
00419697 pop edi
00419698 pop esi
00419699 pop ebx
0041969A mov esp, ebp
0041969C pop ebp
0041969D ret
Dunque andiamo all'indirizzo 0041946F e troviamo:
|00419456(C)
|
0041945F mov eax, dword ptr [004EE990]
00419464 test eax, eax
00419466 0F8432020000 je 0041969E // se eax=eax allora questo salto ci fa andare al messaggio
//"the purchasing process ecc...."
0041946C cmp eax, 00000001
0041946F 0F85F8010000 jne 0041966D // questo è il salto che ci manda alla beggar off
00419475 push 004FABE0 // se eax è diverso da 1
0041947A call 004DFE60
0041947F add esp, 00000004
00419482 test eax, eax
00419484 7509 jne 0041948F // bene bene ,guardiamo un po' questo saltino dove ci manda!
00419486 xor eax, eax // riazzera il valore contenuto in eax
00419488 pop edi
00419489 pop esi
0041948A pop ebx // se la funzione a 00419484 non salta allora appare la
0041948B mov esp, ebp // beggar off come faceva di sopra.
0041948D pop ebp
0041948E ret
Ecco dove ci porta il salto a 00419484:
|00419484(C)
|
Possible StringData Ref from Data Obj ->"REGISTERED" // ci porta direttamente alla versione
| // registrata del prog.
0041948F push 004EE994
00419494 lea eax, dword ptr [ebp+FFFFFDC8]
0041949A push eax
0041949B call 004DFAC0
004194A0 add esp, 00000008
004194A3 lea eax, dword ptr [ebp+FFFFFDD8]
004194A9 push 004FAB10
004194AE push eax
004194AF call 004DFAC0
.............
Dunque non ci resta altro da fare che andare a modificare quel jnz 0041966D e quel jne 0041968F, ora mentre però è più facile da cambiare quest'ultimo, si tratta infatti di cambiare quel 7509 con un 7409 in modo da farlo diventare un jz, per il primo le cose si fanno per così dire un po' più complicate, almeno per un newbies, od almeno per un newbies quale ero io,infatti come vediamo non ci sono solo due byte, ma ben 12 ovvero 0F|85|F8|01|00|00|, per vedere cosa si deve sostituire poi nell'editor esadecimale a questi bytes, devo usare il SIce.
Dunque ripartiamo facendo partire il prog, e andando nel box della registrazione, qui mettiamo il nostro bel numerino "22442244" e prima di premere OK, premiamo Ctrl+d in modo da far apparire il Sice,qui mettiamo un bpx (breakpoint on execution) su getwindowtexta, quindi premiamo F5 per uscire da SoftIce e premiamo 'Ok',a questo punto SIce popperà, e noi,premiamo F12 finché non vediamo il nome Pixel3D nella riga verde in basso , cancelliamo tutti i bp con bc* e intanto ci andiamo a modificare quel salto da 7509 a 7409 scrivendo "a 015F:00419484 " ma 015F solo nel mio caso eh!, per voi sarà diverso,e scriviamo jz 0041968F, ora andiamo a modificare l'altro salto, dunque scriviamo "a 015F:0041946F" e scriviamo jz 0041966D, e vediamo che apparirà al posto di 0F85 ,751E, e che sotto tale jump verranno a scriversi un altro nugolo di funzioni, bene, queste vanno tutte noppate fino a quella all'indirizzo 00419475 esclusa, e per nopparle si deve ovviamente scrivere "a l'indirizzo" e nop.
Alla fine i nop saranno 4, come vedremo,uscendo dal SIce, il programma si riterrà registrato e tutte le funzioni della versione registrata sarannoa nostra portata di mano.
Poichè però le modifiche fatte con il SIce, così come per gli altri debugger, valgono solo per una volta, per rendere permanenti le nostre modifiche dovremmo andarle a mettere nell'editor esadecimale.
Dunque più "professionalmente " potremmo trovare le parti da modificare facendo nell'editor, Goto e scrivendo l'offset che ci siamo segnati mentre eravamo nel WDasm e che ci appariva,quando eravamo sulla stgringa che ci interessava in basso a destra; oppure potremmo cercare usando Find Text e cercando per esempio "0F85F8010000". Una volta trovata tale sequenza non ci resta che sostituirla con 751E90909090, poco più in là poi vediamo un familiare 7509, e quello lo cambiamo com 7409.
Salviamo ed ecco fatto,abbiamo un programma che si registra con qualsiasi seriale,tranne che con quello giusto, e che ci da tutte le funzioni della versione registrata.
Un altro modo di crakkarlo, poteva essere il non far scadere mai il tempo per il nostro programma completo, ma delle due strade ho scelto quella che vi ho mostrato sopra, chissà, magari un'altra volta mi ci metto e provo quella strada.
Ciauzzzz e alla prossima (se mai ci sarà ('azz tocchiamoci!!))
Pincopall
P.s. Vorrei chiudere con una frase di +ORC, che non ho messo su perkè non mi ci stava:
"If you give a man a crack he'll be hungry again tomorrow, but if you teach him how to crack, he'll never be hungry again." +ORC
Note Finali
Spero di essere stato chiaro, comunque se ci sono dei problemi la mia e-mail la conoscete. Devo dire che mi si potrebbe imputare di essere stato troppo lungo nella parte sul SoftIce,ma se lo ho fatto è perché quando ero totally newbie ,speravo di trovare un tutorial fatto bene come questo ,'azz come sono modesto,no no a parte gli scherzi,mi sono dilungato per rendere più chiari possibile i concetti che ho esposto a tutti quelli che li leggeranno ai quali,come succedeva a me, potrebbero sorgere delle domande.
Per concludere vorrei ringraziare tutti coloro dai quali ho appreso,apprendo ed apprenderò sempre di più in questi campi,quindi tutti i componenti della UIC tra i quali Quequero, TiN_MaN, [Alt_255], Phobos, _Golem_, cod, AndreaGeddon, e tutti insomma.
Altro ringraziamento va a Nio e Bebos per il supporto morale che non mi hanno dato e che quindi mi ha dato un ulteriore spinta.
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 malevoli 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.