2010-11-20 9 views
5

Sto scrivendo un plug-in per un'applicazione Java. Potrei offuscare il plugin, ma sarebbe comunque facilmente reversibile.Posso usare la compilazione nativa come offuscamento Java

Credo che se potessi compilare questo plugin in una libreria condivisa, che utilizza pesantemente JNI per comunicare con l'applicazione principale, sarebbe molto più difficile decodificare. Sono disposto a sacrificare alcune prestazioni in JNI e l'applicazione su cui sto codificando supporta il caricamento della libreria condivisa. L'unico problema è che io non sono a conoscenza di uno strumento che fa il lavoro: gcj sembra dipendere proprio runtime e IKVM.NET - su .NET

Per essere precisi:


public class PluginImpl implements Plugin { 
    @Override 
    public void startPlugin(PluginContext ctx) { 
     ctx.helloWorld(); 
    } 
} 

dovrebbe essere convertito in


public class PluginImpl implements Plugin { 
    @Override 
    public native void startPlugin(PluginContext ctx); 
} 

e il corpo del mio metodo startPlugin è compilato in una libreria condivisa.

(beh, sì, lo so, avrei potuto scrivere questo plugin in C in primo luogo)

+1

perché dici che il bytecode offuscato può essere facilmente decodificato? – hhafez

+9

Chiunque abbia il tempo e la pazienza per de-offuscare il tuo bytecode può fare lo stesso con il codice nativo, dato più tempo. Stai sacrificando le prestazioni, l'incapacità di eseguire il debug, l'affidabilità (quando il Java compilato-nativo si comporta invariabilmente in modo diverso rispetto a quello eseguito nella JVM) e giorni del tuo tempo per un "guadagno" molto basso e un prodotto di gran lunga inferiore. ** Abbandona ora ** mentre non hai investito così tanto tempo nella confusione che ritieni di avere * solo * di spedire il prodotto in questo modo ... – SimonJ

+2

Forse dovresti portare la tua app a Perl ;-) – helpermethod

risposta

1

presumo di avere buone ragioni per andare per la compilazione nativa. L'opzione che è possibile esaminare è Excelsior JET ovvero una soluzione Java certificata.

+0

Ancora esegue il proprio runtime: "Gli eseguibili risultanti necessitano di Excelsior JET Runtime per l'esecuzione, ma non di Sun JRE." (http://www.excelsior-usa.com/jetfaq.html) – obfuscer

+0

Beh, +1 comunque per essere un prodotto molto interessante. –

+0

Qualsiasi app Java richiede un runtime Java con garbage collector, isolamento del contesto (se JNI, CNI o altro) ecc. Excelsior JET precompila il codice bytecode fino al codice nativo ottimizzato. Ha ancora un compilatore JIT per la gestione di classi che non sono state precompilate: proxy dinamici, plugin di terze parti e così via. –

0

È possibile che il proprio plug-in fornisca il proprio servizio su RMI. In questo modo il plugin sarebbe un'applicazione e potrebbe essere compilato in codice nativo.

+0

Davvero un buon punto, grazie. Sospetto che RMI fuori processo sia troppo penalizzante, ma potrei fare un tentativo. Il bonus aggiuntivo è che potrei usare gcj allora. Vorrei che l'API con cui sto scrivendo fosse più amichevole con la serializzazione. – obfuscer

2

Non si può realmente usare nulla per l'offuscamento del codice se si sta distribuendo codice eseguibile in qualsiasi forma. Qualsiasi codice eseguibile può essere decodificato. Questo è un problema aziendale non un problema tecnico, ed è risolto con mezzi busniess: accordi di licenza, prezzo, time to market, o molto probabilmente una valutazione più realistica dei rischi e dei valori, cioè ammettere a te stesso che il tuo codice non è questo è prezioso In alternativa, consegna il tuo prodotto come un servizio piuttosto che come un eseguibile.

+0

L'offuscamento non è inteso per "prevenire" il reverse engineering, ma solo per renderlo più difficile.Finché sei consapevole del fatto che se si distribuisce codice eseguibile è impossibile impedire completamente il reverse engineering, non c'è nulla di sbagliato nell'usare l'offuscamento come deterrente. – Grodriguez

+0

Esiste un costo definito e un possibile beneficio. È una decisione commerciale. – EJP

+0

Si può dire lo stesso per qualsiasi funzione di qualsiasi prodotto software. Decidere se implementare la funzionalità è una decisione aziendale. La progettazione e l'implementazione sono un lavoro tecnico. Allo stesso modo, decidere se utilizzare l'offuscamento è un problema aziendale. L'offuscamento stesso è un argomento tecnico. – Grodriguez