摩尔勇士复兴版发包逆向分析和源码例程demo分享

2024-4-25 08:48 97 0
简介
0000001E04540B358279000006060000000100000011000249F2000000020000001E04540B358279000004050000000100000011000249F200000002先使用hook随意进行同样的操作取得send包。可以发现很明显只有中间的某个地方不同,猜 ...
0000001E04540B358279000006060000000100000011000249F200000002
0000001E04540B358279000004050000000100000011000249F200000002
先使用hook随意进行同样的操作取得send包。可以发现很明显只有中间的某个地方不同,猜测为时间戳,经过验证后不对。
再抓包下载SWF文件查看

public function send(param1:uint, param2:Array) : void
      {
         var _loc4_:* = undefined;
         var _loc5_:uint = 0;
         var _loc3_:ByteArray = new ByteArray();
         for each(_loc4_ in param2)
         {
            if(_loc4_ is String)
            {
               _loc3_.writeUTFBytes(_loc4_);
            }
            else if(_loc4_ is ByteArray)
            {
               _loc3_.writeBytes(_loc4_);
            }
            else
            {
               _loc3_.writeUnsignedInt(_loc4_);
            }
         }
         _loc5_ = _loc3_.length + this._headLength;
         if(this.addselfFun != null)
         {
            this._result = this.addselfFun(param1,_loc5_,this._result,_loc3_);
         }
         else
         {
            ++this._result;
         }
         writeUnsignedInt(_loc5_);
         writeShort(param1);
         writeUnsignedInt(this.userID);
         writeInt(this._result);
         writeInt(0);
         writeBytes(_loc3_);
         flush();
         this.sendDataError(param1);
         trace(">>Socket[" + this.host + ":" + this.port.toString() + "][cmdID:" + param1 + "]",getCmdLabel(param1),"[data length:" + _loc3_.length + "]");
         if(this.isTrace)
         {
            trace(">>Socket[" + this.host + ":" + this.port.toString() + "][cmdID:" + param1 + "]",getCmdLabel(param1),"[data length:" + _loc3_.length + "]");
         }
         trace(">>Socket[" + this.host + ":" + this.port.toString() + "][cmdID:" + param1 + "]",getCmdLabel(param1),"[data length:" + _loc3_.length + "]");
      }


在这段代码中就能看到发包的构成,很明显this.addselfFun这里生成的this._result就是那个每次都在变动的值。而其它的值都为在包体内就能得到。
在另外一个SWF文件中可以看到

public static function get mainSocket() : SocketImpl
      {
         if(_mainSocket == null)
         {
            _mainSocket = new SocketImpl();
            _mainSocket.addselfFun = function(cmdID:int, len:int, seqno:int, data:ByteArray):int
            {
               var crc:uint = getCrc(data);
               return int(seqno - Math.floor(seqno / 7) + 147 + len % 21 + cmdID % 13 + crc);
            };
            Analytics.reset();
            _mainSocket.errorCallback = Analytics.recordCommand;
         }
         return _mainSocket;
      }

再结合send里面的代码就能发现这里就是计算result的值的地方,只不过它又套了一个名为“crc“”的计算
private static function getCrc(buffer:ByteArray) : uint
      {
         var length:int = buffer.length;
         var crc:uint = 0;
         for(var i:int = 0; i < length; i++)
         {
            crc = (crc ^ buffer) & 255;
         }
         return crc & 4294967295;
      }
再从下面找到计算CRC的代码,就结束了,写到易语言里面。

虽然原代码计算crc里面的i一开始为0,但如果i取1的话从包里所取的文本位置往后推一位也是一样的。

En为所拦截到的包,需要注意源代码里,当addselfFun这个函数没加载的时候,result需要对自己+1。


如图,一个是从抓的包里取出来的现有值,一个是程序自己算的值。


验证相同,结束

下面是demo易语言源码分享。

demo.zip








鲜花

握手

雷人

路过

鸡蛋

最新文章

关注我们:觅风论坛与你快乐分享

收藏本站

用心服务做个非盈利公益编程网站

www.eyyba.com

服务人:觅风论坛

Email:eyyba@foxmail.com

Powered by WWW.EYYBA.COM X3.4© 2001-2023 Inc.   版权所有   

觅风论坛  疆ICP备15020893号-1