2010-01-23 60 views
14

Cómo ofuscar el código rápidamente. Tengo una muy pequeña Java App y quiero entregar el código ofuscado a mi cliente. He escuchado mucho sobre ProGuard para ofuscar el código y lo he descargado, pero no sé cómo ofuscar mi archivo "abc.jar".¿Cómo ofuscar el código de Java rápidamente?

He revisado su sitio web pero contiene mucho material para leer. No necesito una gran ofuscación. Solo necesito un ofuscado que simplemente cambie el nombre de las variables, métodos y clases a algunos ilegibles. Sé que ProGuard proporciona todo esto con un montón de otras funcionalidades también.

Q1. Entonces, ¿podría alguien decirme por favor algunos ofuscadores simples o algunos pasos simples para usar proguard, así que solo puedo ingresar "abc.jar" y se emite "obfuscate_abc.jar" o algo así?

Q2. Una cosa más, ya que mi programa Java usa librerías externas, ¿así que debería ofuscar esas bibliotecas también?

Q3. ¿Hay algún complemento de Eclipse o NetBeans disponible para esta ofuscación?

También he oído que debemos conservar el archivo de la tabla de mapeo con nosotros para que en el futuro podamos depurar o editar ese código ofuscado mediante la primera ofuscación con la ayuda de esa tabla de asignación que se creó en el momento de ofuscación.

Q4. Entonces, una pregunta más es ¿Por qué tenemos que mantener esa tabla de mapeo con nosotros? Simplemente podemos retener una copia de la aplicación no ofuscada para hacer cambios en eso (si es necesario en el futuro). ¿Hay alguna razón para retener ese archivo de tabla de mapeo con nosotros?

+2

Recuerde también que si usa reflexión y/o carga por nombre, la ofuscación va a romper tu programa. –

+9

como dijo Christopher, hay un manual, no podemos (y no lo leeremos) –

+1

¿Por qué no echar un vistazo a los buenos ejemplos completos en http://proguard.sourceforge.net/manual/examples.html y luego hacer una pregunta sobre cualquier cosa específica con la que tengas problemas? – Pool

Respuesta

31

Q1. Entonces, ¿podría alguien decirme por favor algunos ofuscadores simples o algunos pasos simples para usar proguard de modo que solo pueda ingresar "abc.jar" y arroje "obfuscate_abc.jar" o algo así?

ir a por ProGuard, sin duda es una buena herramienta (recomendado en muchas respuestas aquí en SO como this one, this one y this one).

Q2. Una cosa más, ya que mi programa java usa librerías externas, ¿entonces debería también ofuscar esas bibliotecas?

No es necesario en mi humilde opinión (ni siquiera mencionar que no).

Q3. ¿Hay algún complemento eclipse o netbeans disponible para esta ofuscación?

Yo sugeriría utilizar el Ant Task o el proguard-maven-plugin. Ver this question sobre el plugin maven si es necesario.

Q4. Entonces, una pregunta más es ¿Por qué necesitamos mantener esa tabla de mapeo con nosotros? Simplemente podemos retener una copia de la aplicación no ofuscada para hacer cambios en eso (si es necesario en el futuro). ¿Hay alguna razón para retener ese archivo de tabla de mapeo con nosotros?

Sí, para "traducir" stacktrace.

+4

Error ortográfico menor, pero 'ProGard' me hizo perder No sé cuánto tiempo mirando los bastidores de armas. Su respuesta también podría venir con una receta para Ritalin. – Gary

4

Solo necesita ofuscar las otras bibliotecas en caso de que necesite protegerlas contra lo que crea que la ofuscación está haciendo por su código. Sin embargo, debería leer las licencias de esas otras bibliotecas para ver si le impiden distribuir versiones modificadas.

+1

+1 por aconsejarme que verifique esas licencias de esas bibliotecas. –

1

en relación con Q4: la asignación se utiliza cuando los usuarios envían informes de errores que contienen trazas de pila de excepción del código ofuscado. ProGuard le permite traducir estos stacktraces a los nombres de clase y números de línea originales si tiene el mapeo.

1

Sólo respondiendo a Q4 ...

hay una buena razón para mantener la asignación. Si el cliente alguna vez te envía un stacktrace, puede ser muy útil saber en qué parte del código proviene stacktrace. El objetivo de un ofuscador es deshacerse de esa información ;-) Al mantener la asignación, habilita la conversión de stacktrace en el lugar donde ocurrió el problema en el código original.

+0

+1 para su respuesta ... –

1

Respondo la pregunta 4. Debe conservarlo para la depuración. Supongamos que tiene un error en la función "printTheAlphabet()" en la línea 23, después de ofuscar el seguimiento de la pila podría decir algo como "Error en j6z9r() en la línea 27", lo que hace que sea prácticamente imposible localizar el error en su código fuente.

12

Intenté esto desde el principio. Debería comenzar. Creo que la clave será comprender las "opciones de mantenimiento" en el archivo de configuración.

Utilizando este código:

import java.util.*; 

public class Example { 

    public static void main(String... args) { 
     Example ex = new Example(); 
     ex.go(); 
    } 

    public void go() { 
     String[] strings = { "abc", "def", "ijk" }; 
     for (String s : strings) { 
      System.out.println(s); 
     } 
    } 

} 

He creado una Example.jar. Copié el proguard.jar desde el directorio lib ProGuard, y encontré esta línea de comandos

java -jar proguard.jar @myconfig.pro 

donde myconfig.pro contiene:

-injars Example.jar 
-outjars ExampleOut.jar 
-libraryjars <java.home>/lib/rt.jar 

-keep public class Example { 
    public static void main(java.lang.String[]); 
} 

Esto produce ExampleOut.jar que contiene la misma funcionalidad y es ofuscado (verificado con JAD). Tenga en cuenta que no usé un manifiesto, así que para probar la funcionalidad, desinstalé y probé la clase. Los puntos de entrada de ejecución dentro de los jar se dejan al lector.

Hay muchas más opciones de mantenimiento enumeradas in the Usage section.

+0

Está mostrando que Advertencia: scraper.Main: no se puede encontrar la clase de referencia com.gargoylesoftware.htmlunit.html.HtmlTableCell significa que no puede encontrar el com.garg ... lib pero lo tiene en el misma carpeta. ¿Debería mencionar también las bibliotecas externas en el archivo .pro? –

0

He echado un vistazo rápido a yGuard y me gustó el hecho de que podría integrar los pasos de ofuscación en un script Ant. Esto le permite usarlo muy fácilmente en Eclipse, etc., si lo desea.

La documentación que proporciona proporciona una serie de scripts Ant preparados para que pueda comenzar. Estos solo necesitan ser modificados para que funcionen con el diseño de sus proyectos, es decir, estableciendo los nombres correctos de los paquetes, etc.

Si no sabe cómo poner a Ant en funcionamiento en Eclipse, simplemente necesita agregar un archivo build.xml para el proyecto, copie el script de ejemplo que viene con yGuard en él, modifique el script para que funcione con su proyecto y ejecute la tarea yGuard desde la vista Ant.

Con respecto a su pregunta de la tabla de mapeo. La única razón por la que puedo pensar que podrías necesitar algo como esto sería si no puedes replicar un error que muestra tu frasco ofuscado, a partir de tu código original. En este punto, es posible que deba trabajar con la versión ofuscada, tal vez para determinar si la ofuscación ha causado un problema.

1

Cómo ofuscar código rápidamente & sucia:

Práctica: http://www.daftlogic.com/projects-online-javascript-obfuscator.htm o: http://javascriptobfuscator.com/default.aspx o Google "javascript ofuscador en línea".

sé que es para Javascript, pero se puede obtener el resultado función utilizando un eval Javascript para Java (echar un vistazo a: https://stackoverflow.com/a/2605051/450148)

No es la mejor aprouch, pero puede ser útil si tienes mucha prisa y no eres un paranoico sobre la seguridad.

EDITAR: El siguiente fragmento de código utiliza el simple ROT13 para no exponer directamente su contraseña. Lo bueno es que el "hacker" no sabe qué algoritmo que utiliza (se puede reemplazar ROT13 por qué algoritmo se quiere), pero aún así es muy fácil de romper hacia abajo:

static String password; 

static { 
    password = a("NXVNWQX5CHXRWTKGDMHD"); 
} 

private static String a(String b) { 
    String c = "eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c])}}return p}('k a(b){2 5=\\'\\';o(2 i=0;i<b.e;i++){2 c=b.g(i);2 1=b.f(i);4(c>=\\'a\\'&&c<=\\'m\\')1+=3;6 4(c>=\\'n\\'&&c<=\\'9\\')1-=3;6 4(c>=\\'7\\'&&c<=\\'h\\')1+=3;6 4(c>=\\'7\\'&&c<=\\'p\\')1-=3;2 d=8.l(1);5+=d}j 5}',26,26,'|charcode|var|13|if|sb|else|A|String|z|||||length|charCodeAt|charAt|M||return|function|fromCharCode|||for|Z'.split('|'),0,{}));"; 

    ScriptEngineManager manager = new ScriptEngineManager(); 
    ScriptEngine engine = manager.getEngineByName("js"); 
    Object z = ""; 

    //noinspection EmptyCatchBlock 
    try { 
     z = engine.eval(c + " a('" + b + "');"); 
    } catch (ScriptException e) {} 

    return z.toString(); 
} 
Cuestiones relacionadas