zoukankan      html  css  js  c++  java
  • 破解 4399 古剑奇侠 网页游戏

    这混蛋页游的加密真是蛋疼。简单说,用了对称加密,但是key要从php获取,我模拟http请求确获取不到。

    先拿到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什么的。

            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("
    k:" + k.valueOf());
                mk = MD5.hash(k.valueOf().toString());
                k.dispose();
                this.appendText("
    md5:" + 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("
    md5Encrypt:" + mm);
                this.appendText("
    md_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的。

    下面开始破解:

    			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.所以找到:

    2534 íG*’i@öÎí 185482

    3414 j8G3LgWk3h 185482

    各位明白了把。

  • 相关阅读:
    5-python基础—获取某个目录下的文件列表(适用于任何系统)
    Automated, Self-Service Provisioning of VMs Using HyperForm (Part 1) (使用HyperForm自动配置虚拟机(第1部分)
    CloudStack Support in Apache libcloud(Apache libcloud中对CloudStack支持)
    Deploying MicroProfile-Based Java Apps to Bluemix(将基于MicroProfile的Java应用程序部署到Bluemix)
    Adding Persistent Storage to Red Hat CDK Kit 3.0 (在Red Hat CDK Kit 3.0添加永久性存储)
    Carve Your Laptop Into VMs Using Vagrant(使用Vagran把您笔记本电脑刻录成虚拟机)
    使用Python生成一张用于登陆验证的字符图片
    Jupyter notebook的安装方法
    Ubuntu16.04使用Anaconda5搭建TensorFlow使用环境 图文详细教程
    不同时区的换算
  • 原文地址:https://www.cnblogs.com/zc22/p/3339241.html
Copyright © 2011-2022 走看看