樂視(letv)網tkey破解

樂視網tkey算法頻繁變動,如何才能獲得她算法的源碼,以不變應萬變?

本文只用於技術交流,提醒各位尊重網站版權,請勿用於其它用途,否則後果自負!


使用軟件

Adobe Flash Builder 4.X (自己寫小程序時需要)

碩思閃客精靈
JPEXS Free Flash Decompiler (官網)
注:上面兩個軟件使用功能類似,可以起到功能互補的作用。

關鍵swf文件

1. LetvPlayer.swf  (樂視視頻播放器,未加密,通過碩思閃客精靈可正常打開)
2. KLetvPlayer.swf (樂視tkey及其它算法所在的swf文件,已加密,需要解密後才能通過碩思閃客精靈打開)

解密KLetvPlayer.swf

LetvPlayer.swf文件頭標識爲CWS,而KLetvPlayer.swf加密後文件頭標識變爲了ABC。
加密算法已包含在LetvPlayer.swf文件中,具體加解密的功能路徑爲“action”目錄下的com.alex.encrypt包。
可以將其提取出來,通過Flash Builder寫個小程序,用於解密文件頭標識爲ABC的swf文件。
小程序工程及運行的Flash player已上傳(LEVT_Decode.zip),使用時請使用主版本大於11,副版本大於3的Flash player。

分析KLetvPlayer.swf

使用碩思閃客精靈打開解密後的KLetvPlayer.swf文件,在所有的AS文件中搜索關鍵字"api.letv.com"。

在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
從中可以看到獲得tkey時,調用了timestamp.calcTimeKey()方法。

查看TimeStamp文件中的calcTimeKey()方法:
public function calcTimeKey() : String
        {
            var _loc_1:* = this.lib.calcTimeKey(this.tm);
            return _loc_1;
        }// end function
再以"calcTimeKey"爲關鍵字,查找包括它的AS文件。很可惜,找出來的只有調用,沒有具體函數定義。那Letv將獲得tkey的方法定義在哪邊?

找啊找啊找啊,最終發現了一個可疑資源,見下圖:
    
    
     
    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 function

        public function calcTimeKey(param1:int) : int
        {
            ...
        }// end function

C++類似代碼:
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();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章