pyobfuscate – Ofuscador de código Python



Versión: 2.x.

Introducción

pyobfuscate es un ofuscador de código Python, es decir, lo hace, en su mayor parte, ilegible para humanos pero aun ejecutable para el intérprete. El módulo está algo obsoleto, por lo que únicamente corre en la gama 2.x de Python, incluso deben hacerse algunas modificaciones en la versión 2.7 para ejecutarlo correctamente.

La finalidad de ofuscar el código generalmente es la de evitar que un cliente de vuestra aplicación comercial pueda editar o entender el mismo, aunque puede haber otros casos. Utilizar el bytecode generado por el intérprete en algunas ocasiones no es una opción, ya que éste no es compatible entre las distintas versiones; además, fácilmente reversible.

Descargas

El código original puedes encontrarlo en el repositorio de GitHub. Para descargarlo como archivo ZIP, haz click aquí.

También puedes descargar el módulo compatible con Python 2.7 y con las modificaciones que explicaré luego desde este enlace.

Instalación

En sistemas basados en Linux puedes utilizar pip o, una vez descargado y descomprimido el archivo ZIP, ejecutar:

python setup.py install

En Windows, como el instalador no está adaptado para el sistema, deberás utilizar directamente el archivo pyobfuscate.py. Si has descargado el ZIP desde GitHub lo encontrarás como pyobfuscate y deberás renombrarlo a pyobfuscate.py (te pedirá reemplazarlo). Si has optado por la segunda opción al momento de descargar (aquella compatible con Python 2.7) verás pyobfuscate.py luego de la extracción.

Algunas modificaciones

Si has descargado el archivo ZIP con las modificaciones puedes pasar al siguiente apartado.

Primero, para hacerlo compatible con Python 2.7 deberás editar la línea 1105 de pyobfuscate.py. La original es la siguiente:

        except getopt.GetoptError, e:

Reemplázala por:

        except getopt.GetoptError as e:

Segundo, para mayor comodidad, haremos que el contenido del archivo ofuscado vaya directamente a un nuevo archivo de Python, llamado output.py. En la función main, luego de source = open(conf.file, 'rU').read() añade:

    import sys
    fout = open("output.py", "ab")
    sys.stdout = fout

Luego, debajo de print "# dd678faae9ac167bc83abf78e5cb2f3f0688d3a3" (unas líneas más abajo) añade:

    fout.close()
    sys.stdout = sys.__stdout__

De esta manera redireccionamos el contenido de la salida estándar al nuevo archivo.

Aplicación

Ahora sí el módulo ya está listo para ser utilizado. La forma más sencilla de ofuscar un archivo es:

python pyobfuscate.py test.py

Donde test.py es el archivo a ofuscar. Para ver una lista completa de las diversas opciones, ejecuta:

python pyobfuscate.py

La sintaxis es la siguiente:

python pyobfuscate.py [opciones] [archivo]

A modo de ejemplo, observa cómo se comporta el módulo al ofuscar el siguiente archivo.

test.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Talker:
    def say_hello(self):
        print "Hello world!"

def fib(n):
   if n == 1:
      return 1
   elif n == 0:   
      return 0            
   else:                      
      return fib(n-1) + fib(n-2)

def main():
    talker = Talker()
    talker.say_hello()
    a = fib(10)
    print a

if __name__ == "__main__":
    main()

Un simple script con una clase y una función. La primera simplemente tiene un método say_hello que imprime Hello world! en pantalla. La segunda es la sucesión de Fibonacci.

El resultado (archivo output.py) es el siguiente.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
if 64 - 64: i11iIiiIii
class OO0o :
 def say_hello ( self ) :
  print "Hello world!"
  if 81 - 81: Iii1I1 + OO0O0O % iiiii % ii1I - ooO0OO000o
def ii11i ( n ) :
 if n == 1 :
  return 1
 elif n == 0 :
  return 0
 else :
  return ii11i ( n - 1 ) + ii11i ( n - 2 )
  if 66 - 66: iIiI * iIiiiI1IiI1I1 * o0OoOoOO00
def I11i ( ) :
 O0O = OO0o ( )
 O0O . say_hello ( )
 Oo = ii11i ( 10 )
 print Oo
 if 2 - 2: o0 * i1 * ii1IiI1i % OOooOOo / I11iIi1I / IiiIII111iI
if __name__ == "__main__" :
 I11i ( ) # dd678faae9ac167bc83abf78e5cb2f3f0688d3a3

Y al ejecutarlo el resultado es el mismo.

Hello world!
55

Una de las limitaciones del módulo es la incapacidad para relacionar varios archivos. Es decir, únicamente opera con un archivo a la vez.



2 comentarios.

Deja un comentario