• 乐视(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();
    }

  • 相关阅读:
    洛谷P5113 Sabbat of the witch
    「学习笔记」洲阁筛
    【UNR #3】百鸽笼
    LOJ#6703. 小 Q 的序列
    python数组字符串还原为数组
    QGIS导入excel点数据
    QGIS统计面要素中包含的点要素数量
    gpd.read_file(),报错路径在系统文件中不存在
    QGIS平移要素
    QGIS多部件面转单部件面
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5175046.html
Copyright © 2020-2023  润新知