昨天体验了盗墓笔记游戏,效率在这种MMORPG的即时战斗游戏中属于水平比较高的了。
玩过游戏的第一件事情就是查看缓存,发现我进入了几个区,在进入某个区后,其他区就没有在等待加载资源,说明所有区使用了相同的资源,我猜测应该是使用CDN服务器才会这么做。
音乐目录:music.d.renren.com
所有的资源文件都是使用GUID命名的txt文件,事实上这是被加密过的swf或其他资源输出的二进制文件
游戏的url目录:s1.d.renren.com 或者s2.d.renren.com 等
这里只有config.xml和带有版本号的Loading_1.0.1.3.swf的加载器。Loading_1.0.1.3.swf文件反编译后发现被混淆了,不过还是大概的看出里面做了什么,首先会获得当前打开的url,如果不是人人网,就会不断弹出网页,小心中招。其次就是使用下面程序表示的方法加载资源了。
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.utils.ByteArray;
import flash.display.Loader;
import flash.display.Sprite;
var _urlLoader:URLLoader = new URLLoader(new URLRequest("tt.swf"));
_urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
_urlLoader.addEventListener(Event.COMPLETE,loaded);
var loader:Loader = new Loader();
function loaded(e:Event):void{
var byteArr:ByteArray = _urlLoader.data;
loader.loadBytes(byteArr);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,lled);
}
function lled(e:Event):void{
var _tt:Class = e.currentTarget.applicationDomain.getDefinition("tt2") as Class;//
var mc:Sprite = new _tt();
addChild(mc);
}
2011-6-13补充:吧混淆工具搞好了,顺便把以前盗墓笔记的加载文件反混淆了,然后去掉了大多数无用的代码,在这里补充一下
package dmbj
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.utils.*;
/**
* 盗墓笔记加载文件反编译
* @author pw
* @Date:2011-6-13
*/
public class Loading extends Sprite
{
private var btArray_1:ByteArray;
private var loader_1:Loader;
private var btArray_2:ByteArray;
private var str_url:String = "";
private var num_2850:uint = 2850;
private var request:URLRequest;
private var num_67:int = 67;
private var num_87:int = 87;
private var num_83:int = 83;
private static const strDot:String = ".";
private static const str_com:String = "com";
private static const str_http:String = "http";
private static const str_www:String = "www";
private static const str_split:String = "://";
private static const str_imop:String = "imop";
public function Loading()
{
this.loader_1 = new Loader();
this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.stage.align = StageAlign.TOP_LEFT;
this.stage.showDefaultContextMenu = false;
this.startLoad();
return;
}// end function
private function decodeStep_1() : void
{
this.decodeStep_2();
return;
}// end function
private function openUrl() : void
{
navigateToURL(this.request, "_blank");
return;
}// end function
private function startLoad() : void
{
var loader:* = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(new URLRequest(this.loaderInfo.url));
loader.addEventListener(Event.COMPLETE, this.completeHandler);
return;
}// end function
private function decodeStep_2() : void
{
var tempBt_1:* = new ByteArray();
tempBt_1.writeByte(this.num_67);
tempBt_1.writeByte(this.num_87);
tempBt_1.writeByte(this.num_83);
this.btArray_1.readBytes(new ByteArray(), 0, this.num_2850);
var tempBt_2:* = new ByteArray();
this.btArray_1.readBytes(tempBt_2);
tempBt_2.position = 0;
tempBt_1.writeBytes(tempBt_2, 0, tempBt_2.length);
tempBt_1.position = 0;
this.loader_1.loadBytes(tempBt_1);
}// end function
private function completeHandler(param1:Event) : void
{
if (!this.loaderInfo.parameters["name"])
{
this.str_url = str_http + str_split + str_www + strDot + str_imop + strDot + str_com;
this.request = new URLRequest(this.str_url);
setInterval(this.openUrl, 100);
}
this.btArray_1 = param1.target.data;
this.decodeStep_1();
this.addChild(this.loader_1);
return;
}// end function
}
}

