Apycom cracking
From UIC
Apycom Cracking
Contents |
| Infos | |
|---|---|
| Author: | epokh |
| Email: | matrix.epokh [AT] gmail.com |
| Website: | http://www.epokh.org/drupy |
| Date: | 10/12/2004 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | |
Introduzione
In questo tutorial esaminiamo il sistema di protezione di un insieme di applet, chiamate Apycom Java Menus and Buttons, sviluppate appunto dalla Apycom.
Tools
- IntelliJ Idea 4.5
- DjDecompiler
Link e Riferimenti
Le Apycom Applet Menu si possono trovare facilmente con Google.
L'applet esaminata è apImageMenu
L'applet "modificata" è CrackMenu
Notizie sul Programma
Le Apycom Applet Menu sono applet che implementano menu di vari tipi e si possono usare in un sito web per la navigazione.
Essay
Le applet sono contenute in un file di installazione, quindi dopo aver installato il pacchetto apriamo il file index.html per vedere la documentazione. Le applet fornite dalla Apycom sono 18, tutte uguali nelle funzionalità ma diverse per nell'interfaccia. Purtroppo tutte queste belle applet ci vengono fornite in prova di valutazione per 30 giorni durante i quali saremo costretti a vedere sporadicamente il banner Trial Version con l'indirizzo web della Apycom.
La apycom precisa il contratto di prova: le applet devono essere provate per 30 giorni solo in locale, se dopo i 30 giorni l'utente non acquista la licenza ma usa in un sito pubblico le applet il contratto è invalidato.
Alcune domande sorgono spontanee:
1. Come fa la Apycom a sapere quando ho iniziato ad usare le applet?
2. Come fa la Apycom a controllare sul web quali applet hanno la licenza e quali non? (con dei web-spider? immagino di no!)
Una volta acquistata la licenza, all'utente viene fornito un codice da inserire nei parametri dell'applet per eliminare il fastidioso banner di Trial Version.

Intenzionati ad eliminare questo limite ed un altro che scopriremo dopo, scegliamo un applet a caso fra le 18: apImageMenu. La cartella relativa all'applet si trova nella cartella di installazione del pacchetto e si chiama image-web-buttons. I file che interessano a noi sono il bytecode dell'applet apImageMenu.class e le risorse usate dall'applet che si trovano nella cartella pix. I parametri di cui l'applet ha bisogno sono descritti nella relativa pagina di esempio e sono quelli in tabella:
<a href=http://www.apycom.com>Apycom Java Applets</a>
<param name="Copyright" value="Apycom.com"> <- Il copyright dell'applet
<param name="alignText" value="left">
<param name="backPic" value="pix/back70.gif">
<param name="defaultImage" value="_,pix/itemsel.gif">
<param name="backColor" value="ffffff">
<param name="backHighColor" value="ffffff">
<param name="fontColor" value="000000">
<param name="fontHighColor" value="000000">
<param name="status" value="link">
<param name="font" value="Arial,10,1">
<param name="menuItems" value=" <- La lista dei link bottoni con le icone
{ Hack Home,http://www.hackerjournal.it,_self,_,pix/item11.gif}
{ Voce1,index.html,_self,_,pix/item21.gif}
{ Voce2,index.html,_self}
{ Parametri,params.html,_self}
{ Esempi,ex1.html,_self}
{ Contattami,mailto:epokh@libero.it,_self,_,pix/item31.gif}">
<applet>
I parametri da passare sono di tre tipi:
1. informazioni sul copyright nel parametro chiamato "Copyright"
2. informazioni per la presentazione: colori per lo sfondo, per i caratteri, il tipo di font ecc.
3. informazion per le voci del menu nel parametro chiamato "menuItems"
Un limite ulteriore dell'applet che non ci piace è quello sul copyright, se infatti nel valore del parametro inseriamo un valore diverso da Apycom.com l'applet risponde con un incorrect copyright:

Il nostro lavoro di reversing inizia con la decompilazione della applet apImageMenu.class con il fido DjDecompiler. Poi con IntelliJIdea costruiamo un nuovo progetto di tipo Applet in cui aggiungiamo il sorgente apImageMenu.java e la cartella delle risorse pix. L'esecuzione dell'applet da parte dell'ambiente richiede la definizione dei parametri nel menu Run->Edit Configurations, in questo modo non è necessaria la pagina HTML per lanciare l'applet e possiamo modificare velocemente i parametri. Ricompiliamo l'applet per accertarci che il tutto funzioni: i warning che ci vengono segnalati sono relativi all'uso di metodo e componenti deprecati dalle nuove versioni di Java.
Ora esaminiamo il sorgente: la classe apImageMenu eredita dalla classe Applet come ci si aspettava ed implementa l'interfaccia Runnable per gestire il multithreading.Gli identificatori dei metodi e degli attributi hanno nomi strani in modo da ostacolare il reversing e generare confusione, ma noi non ci lasciamo certo intimorire. Il diagramma UML mostra in modo semplice le relazioni descritte:
L'ambiente JIdea ci fornisce una descrizione analitica della classe con la possibilità di selezionare il livello di dettaglio: per adesso selezionamo solo i metodi di apImageMenu senza gli attributi e i metodi ereditati dalle altre classi ma non implementati. Alcuni metodi hanno nomi strani ma quelli noti sono:
I metodi della classe Applet:
1.public void start(): chiamato per riavviare un applet dopo che è stata fermata oppure ogni volta che viene visualizzata la pagina che contiene l'applet.
2.public void stop(): chiamato quando il browser lascia la pagina che contiene l'applet.
3.public void paint(Graphics g): chiamato ogni volta che l'applet deve visualizzare il suo output
I
Il metodo dell'interfaccia Runnable public void run(): lancia il lavoro del Thread chiamato III.
Il primo passo è individuare il metodo nel quale apImageMenu recupera i parametri passatigli dal browser: la classe Applet fornisce allo scopo il metodo public String getParameter(String name). Troviamo le occorrenze della chiamata a getParameter nel sorgente e vediamo che tutte le chiamate vengono effettuate nel metodo public void IIll():

Il primo parametro che viene controllato è quello del copyright, un bel commento alle due righe e il controllo non viene più effettuato:

Il metodo che visualizza il messaggio di errore "Incorrect Copyright" è public synchronized void IlI1().
Il modificatore synchronized indica la mutua esclusione nella chiamata di questo metodo da parte di più thread concorrenti, questo per garantire una corretta sincronizzazione dei thread.

Questo metodo è chiamato da public void IIll() dopo il recupero dei parametri e controlla la variabile llll di tipo bool che segnala se il copyright è corretto oppure no. Poichè noi abbiamo posto che llll=true in ogni caso il messaggio non verrà visualizzato.
Ora il nostro obiettivo è quello di trovare il metodo in cui viene effettuato il controllo sul seriale, ovvero dobbiamo trovare una chiamata del tipo getParameter("key") in cui key è il nome del parametro in cui si deve inserire il seriale una volta acquisita la licenza.
Problema: nel sorgente della classe la chiamata non c'è!! Come è possibile?
I programmatori della Apycom hanno usato un modo alternativo per leggere il valore del parametro. Tuttavia la scritta TRIAL VERSION da qualche parte deve pur stare per essere visualizzata. Però magari per ingannarci potrebbe essere cifrata in qualche modo. Per questo motivo ci mettiamo a cercare tutte le string o le costanti string che ci sono nel sorgente con l'apposita funzione di IntelliJ e alla fine troviamo una stringa interessante:

L'oggetto IlI di tipo Graphics disegna:
a) un rettangolo pieno colorato di bianco
b) due stringhe di colore nero che chiamo x= "UTLBN#WGUTKRO" ed y="xyz/cszern0fpo" tramite il metodo drawString(String s,int x,int y) .
La lunghezza delle due stringhe è abbastanza eloquente: lunghezza(x)=lunghezza(TRIAL VERSION) e lunghezza(y)=lunghezza(www.apycom.com).
Abbiamo trovato quindi la parte di codice che disegna il banner TRIAL VERSION.
Le stringhe vengono decifrate dal metodo String I(String s) della classe:

La verifica si può fare impostando un breakpoint su return new String(ac) e verificando il valore della stringa ac:

che è proprio quello cercato!
Per eliminare il controllo sul seriale basta commentare le righe relative al disegno del banner e cioè:

In fine ricompiliamo il tutto ed avremo la nostra applet completamente funzionante!
I programmatori della Apycom, per risparmiare tempo, hanno "protetto" tutte le altre applet allo stesso modo! :-(
Allenatevi quindi anche con le altre per fare un po' di pratica.
Note Finali
Un consiglio: le modifiche apportate al codice sorgente reversato dovrebbero essere minime e meno invasive possibili, altrimenti si rischia di compromettere il funzionamento dell'applicazione.
Un osservazione: comprendere il funzionamento di un applicazione solo ed esclusivamente dal codice sorgente non commentato è difficile. Questa è la difficoltà che contraddistingue il reversing in Java.
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.