
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
Demostracion de secureSWF
Solo a modo de ejemplo cree esta clase bastante sencilla para que vean el resultado de la encriptacion con secureSWF.
Antes
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
package
{
import flash.display.*;
public class do extends Object
{
public function do( )
{
var _local_1:boolen;
var _local_2 = false<NULL¶m2;
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.
Auspiciado secureSWF