昨天体验了盗墓笔记游戏,效率在这种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 } }