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

    Code:


    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

    Code:


    package
    {
      import flash.display.*;
     
      public class do extends Object
      {
        public function do(  )
        {
          var _local_1:boolen;
          var _local_2 = false
          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.

    1 comment

    Comment from: John Orange [Visitor]
    *****
    We use secureSWF Professional for all our online Flash projects. It is the only one that really works and is easy to use. We've tried all the other software (SWF Protector & SWF Encrypt) before and it didn't do the job and was easily defeated by decompilers.

    Thumb up for secureSWF Pro!
    18.03.10 @ 07:35

    Leave a comment


    Your email address will not be revealed on this site.

    Your URL will be displayed.
    PoorExcellent
    (Line breaks become <br />)
    (Name, email & website)
    (Allow users to contact you through a message form (your email will not be revealed.)
    estate, seo