zoukankan      html  css  js  c++  java
  • 乐视(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文件。
    小程序project及执行的Flash player已上传(LEVT_Decode.zip)。使用时请使用主版本号大于11,副版本号大于3的Flash player。

    分析KLetvPlayer.swf

    使用硕思闪客精灵打开解密后的KLetvPlayer.swf文件。在全部的AS文件里搜索keyword"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"为keyword,查找包含它的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();
    }

  • 相关阅读:
    初认识AngularJS
    (imcomplete) UVa 10127 Ones
    UVa 10061 How many zero's and how many digits?
    UVa 11728 Alternate Task
    UVa 11490 Just Another Problem
    UVa 10673 Play with Floor and Ceil
    JSON对象和字符串的收发(JS客户端用typeof()进行判断非常重要)
    HTML.ActionLink 和 Url.Action 的区别
    EASYUI TREE得到当前节点数据的GETDATA方法
    jqueery easyui tree把已选中的节点数据拼成json或者数组(非常重要)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5175046.html
Copyright © 2011-2022 走看看