Miami, Blog
8
Feb

secureSWF
Este es un tema que me preocupa bastante desde hace algun tiempo, sobre todo cuando hago trabajos freelance, ya que siempre estoy pensando que al mostrar los avances descompilaran el SWF y desapareceran. Bastante paranoico de mi parte pero no esta tan alejado de la realidad (posible). Afortunadamente nunca tuve algun problema al respecto, pero igualmente prefiero estar protegido al respecto. Ademas estos abusos tambien se usan con otros fines tales como el robo de ideas, busqueda de fallas de seguridad o exploits, etc. Tambien es un tema muy importante cuando tu aplicacion reparte premios con valor comercial, ya que es mas tentador aun el tema de conseguir algun beneficio de forma truculenta.

Cualquiera que posea una copia de un descompilador de SWF puede mirar nuestro codigo actionscript. Tipicamente nos protegemos de este abuso agragando licencias al codigo, mecanismos de proteccion de copias y derechos de autor. Sin embargo esto solo nos cubre en el ambito legal. Pero cualquiera puede acceder a tu codigo pasa abusar de el, ya sea para extraer partes, encontrar fallas de seguridad, extraer ideas, etc.

Actionscript es un lenguaje muy facil de descompilar, existen mas de 22 descompiladores hoy en dia. Esto no es una falla de diseño en el lenguaje, es simplemente una realidad de los lenguajes interpretados, tales como Java, .NET, etc.

La encriptacion del SWF (mas bien la ofuscacion del codigo) hace que al descompilar nuestro SWF, el codigo sea confunso y dificil de entender. Cabe mencionar que no es una encriptacion real.

Bueno por ultimo y para no extenderme mas, a pesar de toda la proteccion que nos brinda la ofuscacion del codigo seguimos vulnerables ante la redistribucion ilegal de nuestra aplicacion, cualquiera puede descargar el SWF y publicarlo en otro sitio. Para solucionar esto secureSWF tiene un sistema de proteccion de dominios (la pelicula solo funcionara dentro de los dominios que nosotros especifiquemos) y ademas un loader encriptado (genera un swf aparte que sera el cargador de nuestra pelicula, asigna nombres encriptados al swf y lo desencripta en tiempo de ejecucion haciendo mucho mas complejo el tema de descargar nuestro swf), la gracia de esto ultimo es protegernos de ataques de SWF rippers o grabbers, que van recolectando cuanto SWF encuentran.

secureSWF es una de las mas sofisticadas herramientas para la ofuscacion de Actionscript y es una buena solucion de proteccion para tus aplicaciones creadas con Flash y Flex.
Con secureSWF estaras protegido contra los programas de descompilacion, prevendras la copia y redistribucion ilegal y te ayudara a incrementar la seguridad en tus aplicaciones. Cabe destacar que la interfaz del programa es muy intuitiva, por lo que se hace muy facil empezar a trabajar con el programa. Ademas la documentacion es excelente.

Que hace la encryptacion SWF de secureSWF

  • Control Flow Obfuscation
  • Dynamic Code Wrapping
  • Statement-level Randomization
  • String Encryption
  • Que partes del codigo oculta la ofuscacion de secureSWF

  • Packages (and internal namespaces for AS3)
  • Classes
  • Functions (getters and setters as well)
  • Variables (local and global variables for AS1 and AS2)
  • Handles Inheritance and Polymorphism
  • Dynamic Variables (even the ones done by AS2 eval)
  • Removes Function Parameters Names
  • Frame Labels
  • Symbol Instance Names
  • Button Names
  • Textfield Names
  • Edit Textfield Variables
  • SWF Metadata
  • ActionScript 3 Metadata
  • Primeros pasos con secureSWF

    Manual secureSWF

    Demostracion de secureSWF

    Solo a modo de ejemplo cree esta clase bastante sencilla para que vean el resultado de la encriptacion con secureSWF.

    Antes

    ActionScript:

    package
    {
            import flash.display.Sprite;
            import flash.display.StageAlign;
            import flash.display.StageQuality;
            import flash.display.StageScaleMode;

            public class Main extends Sprite
            {
                    private var _draw:Sprite;

                    public function Main()
                    {
                            super();
                            configStage();
                            createDraw();
                            testFor();
                    }

                    private function testFor():void
                    {
                            for(var i:int = 0; i < 10; i++)
                            {
                                    trace(i);
                            }
                    }

                    private function createDraw():void
                    {
                            _draw = new Sprite();
                            addChild(_draw);
                            _draw.graphics.beginFill(0xff0000);
                            _draw.graphics.drawRect(0, 0, 100, 100);
                            _draw.graphics.endFill();
                    }

                    private function configStage():void
                    {
                            stage.scaleMode = StageScaleMode.NO_SCALE;
                            stage.quality = StageQuality.BEST;
                            stage.align = StageAlign.TOP_LEFT;
                    }
            }
    }

    Despues

    ActionScript:

    package
    {
            import flash.display.*;

            public class do extends Object
            {
                    public function do(  )
                    {
                            var _local_1:boolen;
                            var _local_2 = false<NULL&param2;
                            if( _local_2&&_local_1 )
                            {
                            }
                            if( _local_2 )
                            {
                                    this.break();
                                    if( _local_2 )
                                    {
                                            this.if();
                                            if( _local_2&&_local_2 )
                                            {
                                                    this. do();
                                            }
                                            return;
                    }
                    private function if(  ):void
                    {
                            var _local_1:boolen;
                            var _local_2 = ^===<-^false++;
                            if( _local_1 )
                            {
                                     case = new Sprite();
                                    if( _local_2&&this )
                                    {
                                    }
                                    addChild(this. case);
                                    if( _local_2&&_local_1 )
                                    {
                                            this. case.graphics.beginFill(16711680);
                                            if( _local_1 )
                                            {
                                                    _local_2 = 0>0;
                                                    drawRect(,this instanceof 0-0,100,100);
                                                    this. case.graphics.endFill();
                                            }
                                    }
                                    return;
                    }
                    private var  case:Sprite;
                    private function break(  ):void
                    {
                            var _local_1:boolen;
                            var _local_2:Object;
                            if( _local_2 )
                            {
                            }
                            stage.scaleMode = StageScaleMode.NO_SCALE;
                            if( _local_2 )
                            {
                                    stage.quality = StageQuality.BEST;
                                    if( 0-0||this )
                                    {
                                            stage.align = StageAlign.TOP_LEFT;
                                    }
                                    return;
                    }
                    private function  do(  ):void
                    {
                            var _local_2 = true as param2>=param2;
                            var _local_3:boolen;
                            var _local_1:int;
                            while( _local_1<10 )
                            {
                            }
                            return;
                    }
            }
    }



    Como veran el codigo queda hecho una locura, pero hace exactamente lo mismo que el original. Para este ejemplo, solo use la encriptacion standart, existen otras mas potentes y otras mas suaves. :), activando mas protecciones no podia descompilar el ejemplo, ya que el descompilador crasheaba... :) muy bueno!!!
    Bueno con este ejemplo cierro el articulo, espero les haya parecido interesante. Cualquier comentario o duda sera bienvenida.

    26
    Nov

    carExample-unity3d
    car-Example2-unity3d
    car-Example3-unity3d

    Bueno una vez mas escribiendo sobre Unity3D, la ultima novedad del engine es que ahora es gratuito. Asi que a los que esten interesados en el desarrollo de juegos les recomiendo bajarse el programa y comenzar a experimentar.

    Las imagenes de arriba corresponden a la version actual de un juego de autos que estoy desarrollando en mis tiempos libres. Por ahora solo es la pista, auto y aparece un auto fantasma luego de dar una vuelta. Tiene fallas y quedan muchisimas cosas por hacer, pero creo que va bien encaminado. Ahora estoy usando la version de prueba de Unity3D Pro, lo que me permitio usar el sistema de sombras. Espero lo disfruten y cualquier sugerencia o comentario es bienvenido.

    VER EJEMPLO

    28
    Sep

    Bueno el otro dia continue jugando un poco mas con unity3d, segui solamente la parte numero 1 del tutorial para hacer un fps. (ver tutorial). Hacer todo fue bastante sencillo e intuitivo. La interfaz de unity es muy amigable. Los modelos en 3D me los baje gratis de paginas de por ahí.

    Para exportarlos a unity, deben exportarlos con su programa favorito para el manejo de 3D(3ds max, maya, blender, cinema3d) a formato FBX. Yo use 3ds max. Luego en unity lo importan como un nuevo asset, con respecto a los materiales, unity3D genera perfectamente todos los materiales con contiene el modelo, pero lamentablemente la mayoria de texturas externas, tuve que importarlas a mano luego de pasar el modelo.

    Agregar los pocos funcionamientos que tiene el ejemplo me tomo mucho menos tiempo de lo que me tomo construir el mundo. Unity trae incorporado un asset llamado First Person Controller, este componente ya incorpora los movimientos del personaje con el teclado y el movimiento de camara con el mouse. El resto es cosa de ver el link al tutorial original.

    Aca el resultado de mas menos 5 horas de trabajo.

    Debido al peso de los modelos, el ejemplo quedo medio pesado asi que paciencia si tienen mala coneccion :)

    VER EJEMPLO

    unity3D example 3

    unity3D example 1

    unity3D example 2

    19
    Aug

    Este es un ejemplo de como encontrar la zona en uso de una image. Imaginen que tienen un png con un dibujo uniforme dentro y algunos bordes transparentes. Con este codigo pueden encontrar la minina area en uso para luego usar solo esa zona para lo que necesiten. Podrian facilmente con una aplicacion en Air guardar el corte como un png, asi la imagen estaria optimizada al tamanio minimo que necesita. O cualquier otra cosa que se les ocurra. Ojala le sirva a alguien.

    Saludos

    ActionScript:

    //Create a color mask with a alpha tolerance value. (_alphaTolerance is the percent)
    var maskTolerance:uint = Math.round((2.55) * (100 -_alphaTolerance)) << 24;     
    //Get used zone
    var usedZone:Rectangle = image.bitmapData.getColorBoundsRect(maskTolerance, maskTolerance, true);

    VER EJEMPLO
    DESCARGAR EJEMPLO

    19
    Jul

    Investigando un poco mas sobre google maps me encontre con una libreria de utilidades que proporciona 3 mapas nuevos, el del espacio, la luna y marte. Usarlos es muy simple. La libreria tambien tiene otras utilidades que aun no exploro en profundidad. Si les interesa pueden bajarsela y leer un poco mas en el sitio oficial en google code.
    Visitar aca. http://code.google.com/p/gmaps-utility-library-flash/

    EJEMPLO DE GOOGLE SKY (o presiona la imagen)

    googleSky

    EJEMPLO DE GOOGLE MOON (o presiona la imagen)

    googleMoon

    EJEMPLO DE GOOGLE MARS (o presiona la imagen)

    googleMars

    :: Next >>

    estate, seo