lingedeng的专栏

乐视网tkey算法频繁变动,如何才能获得她算法的源码,以不变应万变?

本文只用于技术交流,提醒各位尊重网站版权,请勿用于其它用途,否则后果自负!

使用软件

Adobe Flash Builder 4.X (自己写小程序时需要)

硕思闪客精灵

JPEXS Free Flash Decompiler (官网)

注:上面两个软件使用功能类似,可以起到功能互补的作用。

关键swf文件

2. KLetvPlayer.swf (乐视tkey及其它算法所在的swf文件,已加密,需要解密后才能通过硕思闪客精灵打开)

解密KLetvPlayer.swf

加密算法已包含在LetvPlayer.swf文件中,具体加解密的功能路径为“action”目录下的com.alex.encrypt包。

可以将其提取出来,通过Flash Builder写个小程序,,用于解密文件头标识为ABC的swf文件。

小程序工程及运行的Flash player已上传(LEVT_Decode.zip),使用时请使用主版本大于11,副版本大于3的Flash player。

分析KLetvPlayer.swf

在IDTransfer文件找到关键的"api.letv.com",并使用其拼接请求视频XML文件的URL:

private function getURL(param1:String) : String{var _loc_2:* = param1 + String(metadata.vid);if (model.config.flashvars.flashvars.hasOwnProperty("platid")){_loc_2 = _loc_2 + ("&platid=" + model.config.flashvars.flashvars.platid);}else{_loc_2 = _loc_2 + "&platid=1";}if (model.config.flashvars.flashvars.hasOwnProperty("splatid")){_loc_2 = _loc_2 + ("&splatid=" + model.config.flashvars.flashvars.splatid);}else{_loc_2 = _loc_2 + "&splatid=101";}_loc_2 = _loc_2 + "&format=1";if (model.config.flashvars.flashvars.hasOwnProperty("nextvid")){_loc_2 = _loc_2 + ("&nextvid=" + model.config.flashvars.flashvars.nextvid);}_loc_2 = _loc_2 + ("&tkey=" + timestamp.calcTimeKey());_loc_2 = _loc_2 + ("&domain=" + encodeURIComponent(BrowserUtil.domain));return _loc_2;}// end function

查看TimeStamp文件中的calcTimeKey()方法:

public function calcTimeKey() : String{var _loc_1:* = this.lib.calcTimeKey(this.tm);return _loc_1;}// end function

找啊找啊找啊,最终发现了一个可疑资源,见下图:

DefineBinaryData(7: com.letv.plugins.kernel.tools.TimeStamp_FLASCC),不管怎样,调查下先。

通过JPEXS Free Flash Decompiler将其导出为swf文件,使用文本工具查看其文件头标识也是以ABC打头。

使用上面解密KLetvPlayer.swf文件的小工具对其解密,解密成功,打开……

Finally

private function ror(param1:int, param2:int) : int{…}// end functionpublic function calcTimeKey(param1:int) : int{…}// end functionC++类似代码:

int GenerateKeyRor(int value, int key) {int i = 0;while (i < key) {value = (static_cast<unsigned int>(value) >> 1) + ((value & 1) << 31);++i;}return value;}string GenerateKey(int stime) {int key = 773625421;std::stringstream tkey;int value = GenerateKeyRor(stime, key%13);value ^= key;value = GenerateKeyRor(value, key%17);tkey << value;return tkey.str();}

艰苦能磨练人的意志。

lingedeng的专栏

相关文章:

你感兴趣的文章:

标签云: