Ofuscar código Java

Asumámoslo: es imposible proteger al 100% nuestro código de miradas indiscretas. Pero eso no implica que no podamos dificultar un poco el proceso de decompilar nuestro código. Y este es el objetivo de los ofuscadores de código.

Un ejemplo de este tipo de herramientas es la aplicación GPL ProGuard que permite, además de ofuscar nuestras clases Java, optimizarlas, comprimirlas y añadirles información de preverificación, de forma que la carga de las clases en Java SE 6 y Java ME 6 sea más rápida y más eficiente.

La herramienta funciona buscando primeramente clases, campos, métodos y atributos no utilizados, los cuáles elimina; pasa entonces a optimizar el bytecode y eliminar instrucciones innecesarias; y, por último, elimina la información de depuración y renombra las clases, campos y métodos restantes utilizando nombres cortos y poco legibles.

Comentarios
  1. Casi da vergüenza tener que usar este tipo de artimañanas para evitar que gente sin escrúpulos se adueñe del trabajo ajeno y saque beneficio de ello. Pero bueno, mientras exista ese tipo de gente supongo que los ofuscadores tendrán también que existir.

    Responder

  2. Ig

    Y yo me pregunto, ¿y que ocurre si hay un bug después de pasar esta herramienta? ¿Cómo se depura con esto funcionando?¿Si se produce un bug te sigue diciendo correctamente en donde se ha producido para que tu puedas depurar el bug?

    Por otra parte, recuerdo perfectamente que Turbo Pascal ya se encargaba de optimizar eliminando el código innecesario, ¿acaso el compilador de java no lo hace?.

    Y otra cosa más, ¿no se supone que la VM ya se encarga de optimizar?

    Yo no programo en Java pero si con un lenguaje para el que se comercializan ofuscadores y a veces dan problemillas inesperados.

    Responder

  3. jpal

    Yo programé en J2ME y usabamos proguard como ofuscador.
    Nuestra manera de usarlo era justamente correr el ofuscador antes de crear los jars finales. Siempre mantuvimos nuestro codigo original, asi que nunca causó problemas. Es más, siempre fue necesario.
    Los problemas presentes en algunos moviles era que cuando se usaban nombres largos en la clases o se superaba un tamaño determinado de los jar, la aplicacion directamente no cargaba. El ofuscador solucionaba este problema.

    Responder

    • Es cierto, yo también he programado para J2ME y usar un ofuscador es esencial.

      De hecho se les suele llamar a estas aplicaciones “ofuscador/compactador”, porque te conviertes los nombres de clases y métodos en una o dos letras. Además, comprueban el código que no se usa y lo eliminan (ideal para quitar los log de depuración, por ejemplo) y algunos (creo que el proguard entre otros) permiten el uso de compilación condicional, al estilo de las macros de C, con lo que el jar resultante es aún más pequeño y rápido.

      A mi me daba ratios de reducción de la cuarta o la quinta parte del jar sin ofuscar (tan apenas usaba ficheros de gráficos).

      Responder

  4. Muy buen post, pero una pregunta, no tendras por ahi info de algun ofuscador libre para c#??

    Responder

  5. Ok gracias, le voy a dar una probadita.

    Responder

  6. Ofuscar tu codigo, y con un software con licencia GPL, que verguenza, todo el software deberia de ser libre.

    Responder

    • ¿A qué te dedicas, Cesar?

      Responder

      • Desarrollo aplicaciones web para una empresa y tambien hago trabajos de freelance, como hacer implementaciones de sistemas a la medida, la mayoria de ellos software libre y a dar soporte a los mismos.

        Responder

        • ¿Y nunca has trabajado ni trabajarías en una empresa que no creyera en el software libre?

          Responder

          • La verdad nunca me lo he planteado, yo se que estamos inmersos dentro de un sistema en el cual hay software libre y software propietario, entre otras cosas, y cada quien es libre de elegir su parte. Yo me decidi por el uso de software libre, y trato de no usar software propietario, y con mi comentario original queria mostrar la ironia de usar un programa con licencia GPL para cerrar tu codigo, contradictorio, no?

  7. Mi experiencia con Proguard es bastante mala.

    Una vez le pregunté al tipo que lo lleva como hacer para que su software ignorase los jars embebidos, y no solo se ofendió cuando le señale que era un defecto que no se pudiera hacer, sino que hasta borró el thread de su foro.

    Un figura.

    Responder

    • ¿Así sin más? Joder. Pues si se dedica a borrar cualquier crítica constructiva no sé para qué leches quiere el foro…

      En fin, qué se le va a hacer. La gente es como es.

      Responder

  8. Vito

    Interesante tema y muy interesante también los comentarios. Entiendo la opinión de cesar, sin embargo me he topado con la necesidad de hacer una aplicación para la cual no puedo dejar el código fuente accesible, soy seguidor de zootropo leído su libro y seguidor de esta comunidad en general y quisiera sus opiniones sobre como generar código binario, compiladores, ofuscadores, etc. para código Python.

    Gracias de antemano.

    Responder

  9. Hola Vito, mira para python una de las formas faciles de compilar el codigo y que sea un poquito(aclaro un poquito, por que tampoco es inaccesible) es:
    1 – Importa en otro .py lo que queres ocultar, esto va a generar un .pyc que te permite sacar los .py y trabajar con los bitcode (archivos .pyc)
    2 – Sino abri el archivo .py con Geany, y anda a la opcion que dice Compilar y listo
    Pero que te haya servido de ayuda saludos.-

    Responder

  10. Vito

    Muchas gracias por tu aporte Tuxis,
    Voy a descargar el Geany y probar lo que me dices, aunque leí el manual de Geany y dice lo siguiente:

    “”"”"”
    Compile

    The Compile command has different uses for different kinds of files.

    For compilable languages such as C and C++, the Compile command is setup to compile the current source file into a binary object file.

    Java source files will be compiled to class file bytecode. Interpreted languages such as Perl, Python, Ruby will compile to bytecode if the language supports it, or will run a syntax check, or failing that will run the file in its language interpreter.

    “”"”"”

    Yo tenia ganas de pasar un código por un ofuscador y luego por un compilador. pero la verdad ahora es que estoy empezando a investigar así que cualquier aporte es bienvenido.

    Responder

  11. yamidt henao

    Hola a todos,

    Muy interesantes los apuntes, yo soy del pensamiento de cesar, el conocimiento debe ser libre, es la unica manera de tener un mundo mejor…en fin, queria preguntar ahora, si alguien me guia a como poder localizar los .py de un .pyc?? se los agradeceria bastante, aclaro que esto lo usare para un desarrollo libre que se llama endian..pero han puesto .pyc.

    Gracias y saludos

    Yamidt

    Responder

  12. Jorge

    Hola buenas tardes soy Jorge

    Respecto al comentario de Cesar, me quede con la duda de si por ejemplo yo tengo una empresa de software privado, y protego mis .jar con ProGuard ¿entonces que contradicciones hay con la licencia GPL? ¿podría vender mis programas normalmente, o tendría que pagar a los creadores de Proguard?, ¿o si protego mis programas privados ya serían libres o algo así?, que alguien me explique por favor por que no lo entiendo muy bien, Gracias

    Responder

  13. demonioazteka

    que buen debate, el problema es que los que usan GPL no la respetan y violan sus reglas, las unicas licencias completamente libres son las de Apache y la MIT y BSD, GPL fue creada para promover el conocimiento siempre respetando y retribuyendo a sus autores originales.

    le pregunto a Cesar, tu has contribuido, liberado versiones de sistemas que hayas modificado, o has donado a esos proyectos ya que lucras con los mismos. y Jorge lo que pregunta que si Usa proguard su aplicacion se hace GPL la respuesta es no, esta licencia esta apegada al desarrollo es decir si tu descargas proguard y creas una nueva version basado en este. entonces si el resultado debera tener una version GPL tambien como minimo.

    Responder

Deja un comentario