保护你的flash(as3)程序基于socket方式传送swf文件

前段时间在 flashseer看到有人提到:可以通过socket方式传送swf文件,让用户无法获取到swf文件... 当时还没有出as3的反编译,所以对程序的保护没有在意. 随着反编译程序的平民化,不希望别人看到源代码的朋友就比较着急...

通过socket方式传送swf文件来避免泄漏源代码的思路(只适用as3): 让主程序的loader(前台swf)通过socket连接到后台程序,然后请求需要的主程序文件.后台读取主程序数据通过socket发送给主程序的loader.前台swf适用Loader.loadBytes方法显示主程序文件.

下面是测试的源程序:

前台loader:
// -------------
//
Base64和StringUtil在网上自己找吧
import Base64;
import StringUtil;
var  socket  =   new  Socket();
socket.connect(
" localhost " 11915 );

socket.addEventListener(Event.CLOSE, closeHandler);
socket.addEventListener(Event.CONNECT, connectHandler);
socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);

var  response:String;

function  writeln(str:String): void  {
 str 
+=   "" ;
 
try  {
  socket.writeUTFBytes(str);
 } 
catch  (e:IOError) {
  trace(e);
 }
}

function  sendRequest(): void  {
 trace(
" sendRequest " );
 response 
=   "" ;
 writeln(
' bin ' );
 socket.flush();
}

function  readResponse(): void  {
// 接受数据
  var  str:String  =  socket.readUTFBytes(socket.bytesAvailable);
 response 
+=  str;
// 当数据以end结束的时候,数据传输结束
  if (StringUtil.endsWith(str, ' end ' ))
 {
  response 
=  response.substr( 0 ,response.length - 3 );
// 把字符串转换为ByteArray
   var  ba  =  Base64.decodeToByteArray(response);
  
// trace('bytearray=====',ba);
   var  l:Loader  =   new  Loader();
// 从 ByteArray 对象中所存储的二进制数据中加载。
  l.loadBytes(ba);
  
// trace(l.content);
  addChild(l);
 }
}


function  closeHandler(event:Event): void  {
 trace(
" closeHandler:  "   +  event);
}

function  connectHandler(event:Event): void  {
 trace(
" connectHandler:  "   +  event);
 sendRequest();
}

function  ioErrorHandler(event:IOErrorEvent): void  {
 trace(
" ioErrorHandler:  "   +  event);
}

function  securityErrorHandler(event:SecurityErrorEvent): void  {
 trace(
" securityErrorHandler:  "   +  event);
}

function  socketDataHandler(event:ProgressEvent): void  {
 trace(
" socketDataHandler:  "   +  event);
 readResponse();
}


//后台scoket程序,由于适用php写比较简单,就用php写了.
<? php
// error_reporting(E_ALL);
error_reporting ( 0 );
set_time_limit ( 0 );

ob_implicit_flush ();

$address   =   ' localhost ' ;
$port   =   11915 ;

if  (( $sock   =  socket_create(AF_INET ,  SOCK_STREAM ,  SOL_TCP))  <   0 ) {
echo   " socket_create() failed: reason:  "   .  socket_strerror( $sock .   "" n " ;
}

if ((
$ret  = socket_bind( $sock $address $port )) < 0) {
echo 
" socket_bind() failed :  reason :   "  . socket_strerror( $ret ) .  "" n " ;
}

if  (( $ret   =  socket_listen( $sock ,   5 ))  <   0 ) {
echo   " socket_listen() failed: reason:  "   .  socket_strerror( $ret .   "" n " ;
}
echo 
" connect 保护你的flash(as3)程序基于socket方式传送swf文件保护你的flash(as3)程序基于socket方式传送swf文件保护你的flash(as3)程序基于socket方式传送swf文件保护你的flash(as3)程序基于socket方式传送swf文件保护你的flash(as3)程序基于socket方式传送swf文件. " ;
do {
if ((
$msgsock  = socket_accept( $sock )) < 0) {
echo 
" socket_accept() failed :  reason :   "  . socket_strerror( $msgsock ) .  "" n " ;
break ;
}

do  {

  socket_recv(
$msgsock ,   $buf ,   2048 ,   0 );
  
if  ( $buf   ==   '' ) {
socket_close(
$msgsock );
    
echo   " some one quit " ;
break ;
}
  
else   if ( $buf   ==   ' bin ' )
  {
// 读取主程序数据
    $f   =   fopen ( ' main.swf ' , ' r ' );
   
$data   =   fread ( $f , filesize ( ' main.swf ' ));
   
fclose ( $f );
// 转换为字符串
   //echo base64_encode($data);

    $talkback   =   base64_encode ( $data ) . ' end ' ;
  }
// 发送
socket_send( $msgsock ,   $talkback ,   strlen ( $talkback ) , 0 );
while  ( true );
socket_close(
$msgsock );
while  ( true );

socket_close(
$sock );
?>

你可能感兴趣的:(socket)