Pensando a questo, ci sono diversi tipi di offuscamento. Cominciamo con l'offuscamento del codice sorgente, che è una completa perdita di tempo; è abbastanza difficile da capire senza quello! Quindi concentriamoci invece sull'offuscamento del pacchetto di consegna, su come il codice viene consegnato all'utente.
Minore offuscamento
Esistono lievi offuscamenti per impedire all'utente casuale di infilare le dita e rompere facilmente le cose. Non tiene fuori l'hacker determinato, ma ha valore nell'aiutare a garantire che le cose che ti viene chiesto di supportare siano quelle che hai effettivamente consegnato. Il livello di protezione richiesto per questo genere di cose è davvero piuttosto basso; il pacco di consegna non deve semplicemente apparire leggibile e modificabile (senza strumenti specialistici) ed è abbastanza buono.
La minimizzazione Javascript è un esempio di questo, sebbene non sia commercializzata come tale. Nessuno nella loro mente corretta vorrebbe leggere e modificare un file JS minimizzato, anche se è tecnicamente possibile farlo se sei determinato / abbastanza persistente.
Allo stesso modo con la consegna di applicazioni Java. Impacchettare semplicemente il codice in un JAR eseguibile bloccherà la maggior parte della follia, anche se ha tutta la forza di un educato cartello "Please Keep Off The Grass" in un parco cittadino.
Anche quando si consegna il codice C ++, sarà sufficiente rimuovere i simboli non necessari dall'eseguibile per qualificarsi come offuscamento minore. La chiave è che è scomodo leggere il risultato come utente, ma non è un problema eseguirlo come un computer.
Grande offuscamento
L'offuscamento maggiore sta tenendo fuori l'utente determinato e competente . È anche un gioco perdente totale; se un computer può eseguirlo, una persona può sceglierlo a parte e capire cosa fa. Il più vicino che potresti ottenere sarebbe far decifrare continuamente il programma, trasformando quello che fa in una volta in una cosa completamente diversa che fa in un altro momento. Creare una cosa del genere sarebbe piuttosto difficile e comunque non impedirebbe a un hacker davvero bravo (anche se alla fine sarebbe abbastanza incrociato con te per la quantità di sforzo richiesto per decifrare tutto quel codice che si modifica da solo).
È molto meglio pensare in termini di altre soluzioni. Ad esempio, potresti conservare i "gioielli della corona" del codice sui server che controlli e consentire solo le chiamate di servizio ad esso, rendendo il client un omaggio essenzialmente gratuito che è un front-end per i bit preziosi. Oppure potresti seguire il percorso più contrattuale / legale e consegnare gli eseguibili solo alle organizzazioni che accettano formalmente di non rovistare nel tuo codice o di compensarti se lo fanno (quindi sarebbe una sorta di NDA). Lo scopo sarebbe quello di creare un forte incentivo per l'hacker di non hackerare e per gli utenti di mantenere il codice lontano da eventuali hacker non vincolati dall'accordo.
Ma non devi presumere che il tuo codice non possa mai essere decifrato. Con la virtualizzazione, qualsiasi stato del programma di un'esecuzione può essere esaminato e monitorato e tutto ciò che cerca di sconfiggere tale (ad esempio, il monitoraggio dell'orologio su una fonte di tempo esterna) avrà molte più probabilità di causare problemi agli utenti legittimi rispetto agli hacker. (Vedi la storia di DRM per come anche gli editori di informazioni molto determinati non possono mantenere sicuri i loro sistemi una volta che il codice è nelle mani dei loro avversari.) È molto meglio concentrarsi sul rendere davvero felici gli utenti legittimi. Le perdite dovute al crack occasionale non saranno nulla se paragonate al denaro extra portato a soddisfare adeguatamente i clienti.