前段时间在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();
- }
socket(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.";
- 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);
- ?>