破解 4399 古劍奇俠 網頁遊戲

這混蛋頁遊的加密真是蛋疼。簡單說,用了對稱加密,可是key要從php獲取,我模擬http請求確獲取不到。php

先拿到LDLoader,找到:算法

        private function loadFile() : void
        {
            var _loc_3:String = null;
            var _loc_4:String = null;
            var _loc_5:BigInteger = null;
            var _loc_6:String = null;
            var _loc_7:BigInteger = null;
            var _loc_8:URLRequest = null;
            var _loc_9:URLVariables = null;
            var _loc_1:* = loaderInfo.parameters;
			
			
            var _loc_2:* = int(Math.random() * 5000 + 3000);
            this.daba = new BigInteger(_loc_2.toString(16));
			
            this.pawa = new BigInteger(_loc_1.P);//21a1
            this.wodA = new BigInteger(_loc_1.A);//5b2
			 
			
            _loc_8 = new URLRequest("get_dec.php");
            _loc_8.method = URLRequestMethod.POST;
            _loc_9 = new URLVariables();
			
			_loc_6 = _loc_1.KEY;//gjqx_key_pre_7
            _loc_9.KEY = _loc_6;//gjqx_key_pre_7
			
			_loc_5 = new BigInteger(_loc_1.G);//dd
			_loc_7 = _loc_5.modPow(this.daba, this.pawa);//175e m
            _loc_9.B = _loc_7.valueOf();//1765
			
            _loc_8.data = _loc_9;
            this._urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
            this._urlLoader.addEventListener(Event.COMPLETE, this.phpCompleteHandler);
            this._urlLoader.addEventListener(IOErrorEvent.IO_ERROR, this.ioErrorHandler);
            this._urlLoader.load(_loc_8);
            _loc_5.dispose();
            _loc_5 = null;
            _loc_7.dispose();
            _loc_7 = null;
            this._ping = this._ping + "ke";
            return;
        }// end function

  這段代碼就是獲取key的。其中他又從swf的參數獲取了3個babamama什麼的。app

        public function startUp(param1:ByteArray, param2:String, param3:int) : void
        {
            var k:BigInteger;
            var mk:String;
            var data:* = param1;
            var key:* = param2;
            var swfLen:* = param3;
            var mm:* = key;
            k = this.wodA.modPow(this.daba, this.pawa);
            this.appendText("\nk:" + k.valueOf());
            mk = MD5.hash(k.valueOf().toString());
            k.dispose();
            this.appendText("\nmd5:" + mk);
            mm = this.getFileName(this._keylab, mk);
            this._okeymama = this.getFileName(this._okeymama, mk);
            this.wodA.dispose();
            this.daba.dispose();
            this.pawa.dispose();
            this.appendText("\nmd5Encrypt:" + mm);
            this.appendText("\nmd_okey:" + this._okeymama);
            try
            {
                data = BytesCrypt.getInstance().decryptBytes(data, mm, 2000);
                this.loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.completeHandler);
                this.loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.errorHandler);
                this.loader.loadBytes(data, new LoaderContext(false, ApplicationDomain.currentDomain));
            }
            catch (err:Error)
            {
                appendText("BytesCrypt error");
            }
            return;
        }// end function

  這段代碼破解GameEntry.swf的。dom

下面開始破解:this

			CrackHelper.loadByteArray('../GameEntry.swf', function(path:String, byte:ByteArray):void	
			{
				this._keylab = 'vCFWJ8YwoftT9A==';
				for(var k:int = 0;k<9999;k++)
				{
					var b:ByteArray = new ByteArray;
					b.writeBytes(byte, 0, byte.length);
					var mk = MD5.hash(k.valueOf().toString());
					var mm = getFileName(this._keylab, mk);
					try{
						b = BytesCrypt.getInstance().decryptBytes(b, mm, 2000);
					}
					catch(e:Error)
					{
						continue;
					}
					if(b.length <= 50000000 && b.length > 0)
						trace(k, mm, byte.length);
				}
				
				trace('done');
			});

  破解完畢。加密

基本上他用php返回的K,+本地一個隨機數modPOw運算獲得的子進行混合獲得解密的des祕鑰。可是鬱悶的是我沒法模擬php請求,因此我窮舉了。正好這個算法的範圍不超過9999.因此找到:url

2534 íG*’i@öÎí 185482orm

3414 j8G3LgWk3h 185482blog

各位明白了把。md5

相關文章
相關標籤/搜索