您的位置:首页 > 其它

QQ牧场 pastureKey 关键算法,大伙一起研究吧!2010年3月25日

2010-03-25 20:11 344 查看
今天基本每个QQ都收到TX的情书,QQ牧场验证增加了pastureKey。于是找了找算法,还真找到,额!TX这次醒目了,混淆了所有命名。晕,混淆了还容易找一点。。。。不废话了,大伙来看flash里面的代码吧!

var pastureKey:* = _-LF._-Sr();


很明显上面这个变量的值是一个函数的返回值,那么就要找类_-LF,翻阿翻阿,终于找到了。。。

哦哦,下面这个方法又是一个类的方法_-1H._-C0,CommonData.serverTime这个很明显就是时间了,好,我们继续找关键类

public static function _-Sr() : String
{
return _-1H._-C0(CommonData.serverTime);
}


翻几下又找到了

public class _-1H extends Object
{
public static var _-TP:ByteArray;

public function _-1H()
{
return;
}// end function

private static function _-UM(param1:ByteArray) : Array
{
var _loc_2:* = param1.position;
param1.position = 0;
var _loc_3:* = new Array();
var _loc_4:* = param1.length * 8;
var _loc_5:int;
var _loc_6:int;
while (_loc_6 < _loc_4)
{
// label
_loc_3[_loc_6 >> 5] = _loc_3[_loc_6 >> 5] | (param1.readByte() & _loc_5) << 24 - _loc_6 % 32;
_loc_6 = _loc_6 + 8;
}// end while
_loc_3[_loc_4 >> 5] = _loc_3[_loc_4 >> 5] | 128 << 24 - _loc_4 % 32;
_loc_3[(_loc_4 + 64 >> 9 << 4) + 15] = _loc_4;
param1.position = _loc_2;
return _loc_3;
}// end function

private static function f(param1:int, param2:int, param3:int, param4:int) : int
{
if (param1 < 20)
{
return param2 & param3 | ~param2 & param4;
}// end if
if (param1 < 40)
{
return param2 ^ param3 ^ param4;
}// end if
if (param1 < 60)
{
return param2 & param3 | param2 & param4 | param3 & param4;
}// end if
return param2 ^ param3 ^ param4;
}// end function

private static function _-Uz(param1:int) : int
{
if (param1 < 20)
{
return 1518500249;
}// end if
if (param1 < 40)
{
return 1859775393;
}// end if
if (param1 < 60)
{
return 2400959708;
}// end if
return 3395469782;
}// end function

private static function _-CE(param1:Array) : ByteArray
{
var _loc_11:int;
var _loc_12:int;
var _loc_13:int;
var _loc_14:int;
var _loc_15:int;
var _loc_16:int;
var _loc_17:int;
var _loc_2:int;
var _loc_3:int;
var _loc_4:int;
var _loc_5:int;
var _loc_6:int;
var _loc_7:* = param1.length;
var _loc_8:* = new Array(80);
var _loc_9:int;
while (_loc_9 < _loc_7)
{
// label
_loc_11 = _loc_2;
_loc_12 = _loc_3;
_loc_13 = _loc_4;
_loc_14 = _loc_5;
_loc_15 = _loc_6;
_loc_16 = 0;
while (_loc_16 < 80)
{
// label
if (_loc_16 < 16)
{
_loc_8[_loc_16] = param1[_loc_9 + _loc_16];
}
else
{
_loc_8[_loc_16] = _-6B._-MW(_loc_8[_loc_16 - 3] ^ _loc_8[_loc_16 - 8] ^ _loc_8[_loc_16 - 14] ^ _loc_8[_loc_16 - 16], 1);
}// end else if
_loc_17 = _-6B._-MW(_loc_11, 5) + f(_loc_16, _loc_12, _loc_13, _loc_14) + _loc_15 + int(_loc_8[_loc_16]) + _-Uz(_loc_16);
_loc_15 = _loc_14;
_loc_14 = _loc_13;
_loc_13 = _-6B._-MW(_loc_12, 30);
_loc_12 = _loc_11;
_loc_11 = _loc_17;
_loc_16++;
}// end while
_loc_2 = _loc_2 + _loc_11;
_loc_3 = _loc_3 + _loc_12;
_loc_4 = _loc_4 + _loc_13;
_loc_5 = _loc_5 + _loc_14;
_loc_6 = _loc_6 + _loc_15;
_loc_9 = _loc_9 + 16;
}// end while
var _loc_10:* = new ByteArray();
new ByteArray().writeInt(_loc_2);
_loc_10.writeInt(_loc_3);
_loc_10.writeInt(_loc_4);
_loc_10.writeInt(_loc_5);
_loc_10.writeInt(_loc_6);
_loc_10.position = 0;
_-TP = new ByteArray();
_-TP.writeBytes(_loc_10);
_-TP.position = 0;
return _loc_10;
}// end function

private static function _-IM(param1:String) : Array
{
var _loc_2:* = new Array();
var _loc_3:* = param1.length * 8;
var _loc_4:int;
var _loc_5:int;
while (_loc_5 < _loc_3)
{
// label
_loc_2[_loc_5 >> 5] = _loc_2[_loc_5 >> 5] | (param1.charCodeAt(_loc_5 / 8) & _loc_4) << 24 - _loc_5 % 32;
_loc_5 = _loc_5 + 8;
}// end while
_loc_2[_loc_3 >> 5] = _loc_2[_loc_3 >> 5] | 128 << 24 - _loc_3 % 32;
_loc_2[(_loc_3 + 64 >> 9 << 4) + 15] = _loc_3;
return _loc_2;
}// end function

public static function _-TV(param1:ByteArray) : String
{
var _loc_2:* = _-1H._-UM(param1);
var _loc_3:* = _-CE(_loc_2);
return _-6B._-Zl(_loc_3.readInt(), true) + _-6B._-Zl(_loc_3.readInt(), true) + _-6B._-Zl(_loc_3.readInt(), true) + _-6B._-Zl(_loc_3.readInt(), true) + _-6B._-Zl(_loc_3.readInt(), true);
}// end function

public static function _-C0(param1:int) : String
{
var _loc_6:int;
var _loc_2:String;
var _loc_3:* = _loc_2.substr(param1 % 10, 100);
var _loc_4:* = _-IM(param1 + _loc_3);
var _loc_5:* = _-CE(_loc_4);
return _-6B._-Zl(_loc_5.readInt(), true) + _-6B._-Zl(_loc_5.readInt(), true) + _-6B._-Zl(_loc_5.readInt(), true) + _-6B._-Zl(_loc_5.readInt(), true) + _-6B._-Zl(_loc_5.readInt(), true);
}// end function

public static function _-EQ(param1:String) : String
{
var _loc_7:uint;
var _loc_2:* = _-1H._-IM(param1);
var _loc_3:* = _-CE(_loc_2);
var _loc_4:String;
_loc_3.position = 0;
var _loc_5:int;
while (_loc_5 < _loc_3.length)
{
// label
_loc_7 = _loc_3.readUnsignedByte();
_loc_4 = _loc_4 + String.fromCharCode(_loc_7);
_loc_5++;
}// end while
var _loc_6:* = new Base64Encoder();
new Base64Encoder().encode(_loc_4);
return _loc_6.flush();
}// end function

}
}


唉,不会flash的一些关键字看得累阿,又有一个关键的类_-6B,咱们继续找阿

public class _-6B extends Object
{
private static var _-bY:String = "0123456789abcdef";

public function _-6B()
{
return;
}// end function

public static function _-Zl(param1:int, param2:Boolean = false) : String
{
var _loc_4:int;
var _loc_5:int;
var _loc_3:String;
if (param2)
{
_loc_4 = 0;
while (_loc_4 < 4)
{
// label
_loc_3 = _loc_3 + (_-bY.charAt(param1 >> (3 - _loc_4) * 8 + 4 & 15) + _-bY.charAt(param1 >> (3 - _loc_4) * 8 & 15));
_loc_4++;
}// end while
}
else
{
_loc_5 = 0;
while (_loc_5 < 4)
{
// label
_loc_3 = _loc_3 + (_-bY.charAt(param1 >> _loc_5 * 8 + 4 & 15) + _-bY.charAt(param1 >> _loc_5 * 8 & 15));
_loc_5++;
}// end while
}// end else if
return _loc_3;
}// end function

public static function _-Hh(param1:int, param2:int) : uint
{
var _loc_3:* = 32 - param2;
return param1 << _loc_3 | param1 >>> 32 - _loc_3;
}// end function

public static function _-MW(param1:int, param2:int) : int
{
return param1 << param2 | param1 >>> 32 - param2;
}// end function

}


好了,所有的关键代码都找到了,先收藏起来先,那天有空转成C#.Net或者VB.Net的,跟大家一起分享,别丢砖头阿!!

在这希望懂flash的高手帮俺翻译一下转成C#.Net或者VB.Net,大伙慢慢研究,下班了。。。。

哦,差点忘记给大伙测试的数据了,看下面

farmTime 1269515019
pastureKey 54b510366bf0fe149f0cf0092ffbfb214db59346

哪位高手翻译的代码能将上面的farmTime计算得出pastureKey的值,麻烦给个链接!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: