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易语言源码分享。 |