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

    • jokerdm

      Estas herramientas sólo tienen sentido para el código que se envía al cliente, el que entra en productivo.

      Responder

    • Alejandro

      Ig, la idea del ofuscador es configurarlo para que solo ofusque los releases, de modo que los programadores sigan viendo el código comentado, documentado y legible como siempre.
      Saludos

      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?

    • Dreiveen

      +1 todo software deberia mantenerce libre claro q respetando la fuente y siempre aclarar que fuentes estas utilizando y a quienes pertenecen =)

      Responder

  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

    • Hola,Jorge yo programo en Java hace varios años java es OpenSource para eso esta la API en ella podes aportar o usarlo,Siempre se enseña la forma de como usar con ejemplos,pero si vos programas un Sistema para una empresa,este sistema te lleva por ejemplo un año,Si la dejas libre ya no tendriamos trabajo los desarrolladores Java,seria mas facil buscar un codigo en la web y venderla,Estaria bien eso?,Slds

      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

  14. Cadejo

    Cesar la ofuscacion es una medida de seguridad mas. Piense en un servidor de internet y por esas cosas que no deberian ocurrir pero que ocurren este tiene una brecha de seguridad.

    Si entra un hacker y el codigo esta ofuscado es una pared mas que tiene que atravesar para acceder a informacion super-delicada. O el caso del empleado programador(o no) que se dejo un backup y lo vende en el mercado negro.

    Responder

  15. jose

    Libre no es Igual a gratis por siacaso ok. Nuestro lo podemos vender por que nosotros lo hicimos con esfuerzo y estudio no? no por eso significa que vamos a regalar los sitemas que hagamos

    Responder

    • nelson

      Buenas, de hecho amigo jose justamente es lo q se necesita malinterpretar para que lo libre sea IGUAL a lo regalado, esa brecha q mencionas se llama ETICA, y caray disculpen pero ninguna universidad y ningun programador por mas q tenga los conocimientos y a su vez teniendo la habilidad va a perder tiempo en desarollar una aplicacion q gustozamente puede decompilar o hacerle reingenieria solo para saber como lo hizo alguien mas para el solo adaptar.
      Luego logicamente es evidente q libre ES CASI IGUAL a reglado. recuerda q no hay guardianes del codigo libre, osea que cualquiera tome codigo de otro y luego un policia lo detenga y lo lleve a juicio por no declarar en su aplicacion q el codigo usado es de otro programador. ADEMAS si todo el planeta necesita codigo libre entonces no fuese necesario la seguridad informatica porq todos serian honrados, eticos y por tanto para que ponerle clave a tus cuentaas bancarias.

      EN FIN CREO SERA UN BUEN IRONICO COMENTARIO pero por malo q fuese sino proteges tu codigo entonces regalas tu trabajo asi de simple.

      Responder

  16. Pregunta: ¿el codigo ofuscado se puede recompilar?

    Responder

  17. Daniel

    hola soy un pequeño umpalumpa de la programacion en java y al igual que carlos pienso lo mismo mas sin embargo nelson tiene toda la razon es triste que no pueda ser como dice carlos obsequiar metodos para que otro llege lo copie y lo mejore y hacer que el codigo evolucione por asi decirlo y no quede en una idea que alguien tuvo y que asta hay llego por mi parte desarrolle una programacion ofuscada programo con variables inpensables y basandome a objetos y a veces aunque muestre mi codigo tardas en entenderlo y es algo que no puedo evitar es como mi propia firma la firma de un loko

    Responder

  18. Lucas

    A ver, usar un ofuscador no implica siempre estar en contra del software libre.
    Hay empresas que piden desarrollos a medida a otras empresas y estos programas no tiene sentido que sean software libre porque desvelarían secretos de negocio de la compañía.
    En este caso hay veces que en el contrato de un proyecto no queda explicitado si se paga por el código o sólo por el programa.
    Lo que hacen algunas compañías es pagar sólo por el programa y luego sacar el código fuente (de gratis) para darle ese proyecto por ejemplo a otra empresa. Por tanto en este caso un ofuscador está más que justificado y eso a pesar de estar a favor del software libre ya que se emplean BD como PostgreSQL.

    Responder

  19. yoel duran

    Saludos amigos estuve leyendo algunos comentarios y muchos en cierta parte tienen razon, por ejemplo en que a veces es desagradable que tu crees una aplicacion y llegue alguien descompila y te jala el codigo, pero yo diria mas bien que la cuestion no es el codigo si no mas bien el tipo de aplicacion que desarrolles no es lo mismo hacer una simple aplicacion donde no uses conexiones a base de datos a una que si lo requiera porque por ejemplo yo estoy desarrollando una aplicacion de escritorio con conexion a base de datos mysql, y bueno me interesa mucho que mi aplicacion sea segura y por lo tanto que mi codigo no se pueda descompilar ya que seria vulnerable y podrian tener acceso a el servidor de base de datos, lo cual no me conviene, ni a mis clientes, ahora si fuese una aplicacion sencilla sin nada que ver con base de datos me da igual si ven el codigo o no total todo el mundo no programa igual, y por mas que sea la codificacion es muy diferente en cada aplicacion. en fin todo depende de la aplicacion que desarrollemos y para quien recuerden que siempre habra alguien queriendo hacer dinero sin mover un dedo y a costilla de otro, con eso no quiero decir que no compartamos conocimientos, yo diria que hay que ayudarnos entre programadores, pero siempre respetando a tus colegas

    Responder

Deja un comentario