本帖最后由 2017浮影 于 2024-4-24 22:51 编辑
[JavaScript] 纯文本查看 复制代码 0000001E04540B358279000006060000000100000011000249F200000002
0000001E04540B358279000004050000000100000011000249F200000002
先使用hook随意进行同样的操作取得send包。可以发现很明显只有中间的某个地方不同,猜测为时间戳,经过验证后不对。
再抓包下载SWF文件查看
[JavaScript] 纯文本查看 复制代码 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文件中可以看到
[JavaScript] 纯文本查看 复制代码 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“”的计算
[JavaScript] 纯文本查看 复制代码 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。
如图,一个是从抓的包里取出来的现有值,一个是程序自己算的值。
验证相同,结束
|