2011-10-22 7 views
6

Avrò diritto al punto in modo da non dover leggere molto.Caricatore di classi di memoria crittografate Java

Fondamentalmente, ho un file AES-128bit Encrypted Jar. Voglio fare un launcher in modo che possa caricare questo Jar cifrato in memoria ed eseguirlo (usando la chiave).

Ho un semplice programma di caricamento di classi che funziona anche se, a meno che non lo decrypt in una directory ed eseguirlo, ovviamente non farà quello che mi serve (decrypt & carico di memoria).

TL; DR: È necessario eseguire in memoria un Jar crittografato AES-128bit.

Qualsiasi aiuto è molto apprezzato, non esitate a fare domande!

+2

Se vuoi che il tuo codice sia così sicuro, probabilmente non dovresti scriverlo in una delle lingue più facilmente decompilate. È possibile scrivere un caricatore di vasi, ma non c'è modo di impedire alle persone di scaricarlo dalla memoria. – 0x5f3759df

+0

Deve essere compilato in Java. Non perché non possa codificare in altre lingue ma più, altre lingue non supportano quello che sto facendo. –

+0

@ 0x5f3759d E lo stesso vale per C, C#, ... assolutamente qualsiasi lingua. Potrebbero volerci 5 minuti in più, ma alla fine se qualcuno vuole il file jar otterrà la chiave abbastanza facilmente (imposta un punto di interruzione per CreateFile e le consocia nel debugger, magari aggiungine uno per ReadFile con il file trovato e otterrai abbastanza facilmente). Anche se in realtà non vedo il problema - cosa ti impedisce di leggere il file e decifrarlo se hai già il classloader? Cioè qual è il tuo problema attuale? – Voo

risposta

8

Per il codice di esempio su come caricare un vaso/classe da byte[] (che dovrebbe essere il risultato che si ottiene dopo la decrittografia in memoria/non c'è bisogno di salvarlo in qualsiasi parte del file system) vedi http://www.javaworld.com/javaworld/jw-10-1996/indepth/indepth.src.html

Fondamentalmente è necessario usare defineClass per ottenere quello che vuoi.

ma attenzione che questo non offre alcuna sicurezza reale dal momento che tutti finisce (dopo la decrittazione) come codice Java byte in memoria e può quindi essere letta/manipolato/salvato ecc

Un po 'di sicurezza sarebbe possibile da l'attuazione di una JVM su misura e/o pre-JITing il codice in modo che sia nativo ... alcune informazioni si veda per esempio How to create encrypted Jar file?

+0

Grazie! Ci provo per farti sapere come funziona. Stavo anche pensando che un'opzione più semplice sarebbe quella di creare un file temporaneo contenente i jar/byte decrittografati. Carico il vaso temporaneo in memoria, quindi lo elimina dalla cartella temporanea. –

+0

sei il benvenuto ... per favore non dimenticare di revocare/contrassegnare come accettato qualsiasi risposta che è stata d'aiuto! – Yahia

+0

Ho bisogno di ottenere 15 reputazione prima di poter votare. Ma ne sarò sicuro quando raggiungo 15 rappresentanti! –

1

This article è una buona lettura che illustra bene il motivo per cui a tenuta d'aria di protezione del codice non è semplicemente possibile. Puoi renderlo più difficile, molto difficile anche mantenendo il livello più basso possibile, ad es. compilare il codice con istruzioni native che non sono (chiaramente) rappresentabili usando costrutti di linguaggio regolari.

Ma dovresti tenere a mente che in ogni caso, in ultima analisi, i tuoi dati crittografati dovranno essere decifrati usando una chiave e questa chiave, anche se solo brevemente, ma il punto importante è che finirà nella memoria . Non c'è modo di aggirare questo con sistemi operativi e hardware comuni. Quindi, come hacker, puoi sempre tornare indietro a prendere la chiave dalla memoria e tornare indietro da lì in avanti. Non è qualcosa che gli utenti medi sono in grado di fare, ma è certamente possibile.

Problemi correlati