Come funziona ProGuard

Creato il 08 dicembre 2011 da Hnikarr
ProGuard è un programma che, probabilmente, soltanto pochi lettori troveranno utile e/o interessante, perché si rivolge a un settore molto specifico, ma anche piuttosto ristretto, di utenti: chi programma in Java. ProGuard, infatti, è un semplice programma per restringere, offuscare e ottimizzare il codice Java, in vista della distribuzione al pubblico. In pratica, permette di ridurre le dimensioni di un JAR eseguibile, compattando le classi e “potando” i rami secchi, e in più maschera classi, campi e metodi, per complicare la vita a chiunque voglia smontare il JAR e risalire al codice originario. Sia chiaro, non rende impossibile il reverse-engineering, ma lo rende più difficile. Una sicurezza al 100% non esiste e non si otterrà mai, né in questo né in altri campi, perché una persona competente e determinata riuscirà comunque a trovare un modo, proprio come esiste comunque un modo di introdursi in una casa, nonostante lucchetti e allarmi, anche a costo di demolire una parete. Ciò non significa, però, che dobbiamo lasciare la porta spalancata. ProGuard fa proprio questo, oltre a pulire e comprimere il codice: chiude la porta a chiave e costringe a faticare di più chiunque voglia entrare. A parte questo, è ottimo anche per ridurre le dimensioni di un JAR, se vogliamo distribuire un nostro programma in un contesto dove le dimensioni ridotte sono preferibili: applet e cellulari, per esempio.
ProGuard è un programma gratuito, open-source, e distribuito con licenza GNU GPL. Inoltre, è realizzato e distribuito in Java, il che lo rende multipiattaforma senza bisogno di modifiche: funzionerà allo stesso modo su qualsiasi sistema operativo e dispositivo, purché sia installata la Java Virtual Machine. Potete scaricarlo dal sito ufficiale. Al momento, la versione completa è la 4.6, che però ha un problema: non supporta l’ultima versione del Java, ossia il Java 7 (1.7, se preferite). Se siete già passati a quella, vi conviene scaricare la nuova versione di ProGuard, ossia la 4.7: è ancora in fase beta, per cui potrebbe contenere bug o presentare altri problemi; per quanto ho potuto verificare io, però, funziona bene. Dopo averlo scaricato, non ci sarà nulla da installare, basterà estrarre il contenuto della cartella compressa e sarete pronti a usarlo. Una volta estratto, vi troverete di fronte ad alcune cartelle, che contengono tutto ciò che ci serve: il codice sorgente (src), la documentazione (docs), ma soprattutto i JAR eseguibili (lib). Entriamo dunque nella cartella lib, dove dovremmo trovare tre file JAR: proguard.jar, proguardgui.jar e retrace.jar. Proguard.jar e proguardgui.jar sono le due versioni di ProGuard, per compattare e offuscare il codice: la prima funziona da linea di comando, la seconda ha una comoda interfaccia grafica (GUI). Retrace.jar, invece, serve a de-offuscare il codice, ossia a recuperare il codice originario da un file offuscato (o almeno a tentare). Ma vediamo più in dettaglio come si usa ProGuard. Per avviare la versione da linea di comando, sarà sufficiente scrivere: java -jar proguard.jar e aggiungere le eventuali opzioni. Suppongo però che la maggior parte di voi preferirà usare la versione con interfaccia grafica, per cui mi concentrerò su quella. Per avviarla, se il Java è installato correttamente, basta un doppio click sulla sua icona (su un sistema Windows). Altrimenti, sempre su un sistema Windows, potete entrare nella cartella bin e cliccare sul file batch proguardgui, oppure potete digitare questo testo da linea di comando: java -jar proguardgui.jar [-nosplash] Il risultato è lo stesso e vi si aprirà questa finestra.
Puro stile Java, come vedete. In alto a sinistra troviamo alcuni pulsanti, che corrispondono alle varie fasi del processo di compressione/offuscamento. Input/Output serve a selezionare il file JAR su cui vogliamo lavorare (input) e il luogo in cui vogliamo salvare il risultato dell’operazione (output). Shrinking serve a impostare le opzioni per il compattamento del JAR. Obfuscation serve a impostare le opzioni per l’offuscamento del codice. Optimization serve a impostare le opzioni per ottimizzare il codice (non l’avreste mai detto, eh?). Information serve a specificare alcune opzioni su cui volete essere informati nel corso del processo. Process salva le impostazioni e avvia il processo di compattamento-offuscamento-ottimizzazione di ProGuard. ReTrace serve a svolgere l’operazione opposta: de-offuscare il codice offuscato. In basso a destra troviamo anche il pulsante “Load configuration”, che serve a caricare una precedente configurazione di ProGuard, che potremmo aver salvato. Se è la prima volta che lo usiamo, però, ovviamente non ci sarà nessuna configurazione salvata. Dovremo quindi seguire tutta la procedura. Clicchiamo dunque il pulsante “Next”, che troviamo lì accanto.
Il primo passaggio è Input/Output. Nella metà alta della finestra dovremo cliccare su Add input, per selezionare il file (o anche la cartella) su cui vogliamo lavorare. Add output ci permette di scegliere dove vogliamo salvare il risultato finale. Nella metà bassa della finestra, invece, dovremo aggiungere le eventuali librerie extra. Di base, troveremo già la libreria della nostra versione di Java, ma potremmo aver bisogno di aggiungere altre librerie, se il JAR su cui vogliamo lavorare le utilizza. Una volta selezionato tutto ciò che deve essere selezionato, clicchiamo Next. Siamo al capitolo Shrinking. Contiene svariate voci e sarebbe piuttosto lungo descriverle tutte, a una a una. Se tutto ciò che vedete è misterioso, lasciate le impostazioni di base e proseguite. Tutto funzionerà bene. Se sapete cosa state facendo, potete modificare liberamente. Subito dopo troviamo Obfuscation. Anche qui, vale quanto detto in precedenza: se sapete cosa state facendo, modificate a seconda delle vostre necessità. Se non capite nulla di ciò che vedete, lasciate le opzioni di base. Se seguite la via degli smanettoni e volete sperimentare, sperimentate pure. Una voce che potreste voler deselezionare è “Use mixed-case class names”: in certi casi potrebbe darvi problemi e provocare un messaggio di avvertimento, in fase di offuscamento. Dipende comunque dal vostro JAR e dalle librerie che potreste aver caricato. Nella sezione Optimization troverete una lista di opzioni per migliorare e ripulire il vostro codice: a ognuna di quelle voci corrisponde una componente che ProGuard ripulirà, se risulterà inutilizzata. Vale quanto detto prima: nel dubbio, lasciate così com’è. Se però volete sperimentare e capire meglio il funzionamento del programma, potete eseguire anche qui vari tentativi: il file originale non sarà modificato, per cui potrete cancellare e rifare, se il risultato non vi soddisferà. Information contiene altre opzioni, per ricevere segnalazioni di errore, pre-verificare il codice prima di modificarlo e così via. Sempre la solita storia: modificate a vostro rischio. Process, infine, ha due tasti fondamentali, in basso a destra: “Save configuration” ci permette di salvare le impostazioni che abbiamo scelto, per riutilizzarle in futuro e non dover rifare tutto, mentre “Process!” avvia il processo di compressione e offuscamento del codice. Dopo aver cliccato Process!, ProGuard comincerà a lavorare sul nostro JAR. La durata del processo dipende soprattutto dalle dimensioni del file: può andare da un paio di secondi a qualche minuto. Alla fine, riceveremo eventuali messaggi di errore (se qualcosa è andato male), oppure ci informerà sul processo concluso: troveremo così il nostro JAR, ristretto e offuscato, nella cartella in cui abbiamo deciso di salvarlo (la cartella di output), pronto per essere distribuito.