V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bigha
V2EX  ›  程序员

挑战 V 友发的最强前端加密播放器

  •  6
     
  •   bigha · 2023-08-22 17:48:59 +08:00 · 2998 次点击
    这是一个创建于 460 天前的主题,其中的信息可能已经有所发展或是发生改变。

    关联的帖子在这里

    https://www.v2ex.com/t/967324

    个人有个不太好的习惯,有人发这个解密游戏,非要搞出来不可,否则心里别扭!

    第一个网站真实的播放地址,用的是 wasm 这种解密方式,研究了半天,最后找不到入口函数

    就这样放弃?不,我默默的拿出来自己曾经看到过的 RPC 框架

    具体步骤如下:

    1 、RPC 框架下载地址

    https://pan.baidu.com/s/19TyURN-wpqGUYBy1P025ew?pwd=6mu3

    解压缩后,如果是 windows ,那就 bat 直接启动即可,注意需要 java 环境

    2 、随便打开一个视频网页,F12 ,然后添加 XHR 断点 ,然后去刷新网页,不出意外会被断住

    https://api.yangtu.link/v2/jx1

    然后在控制台 console 输入下面的代码

    (function() {
        'use strict';
    
        // Your code here...
        var _mscript=document.createElement("script")
        _mscript.src="https://sekiro.iinti.cn/sekiro-doc/assets/sekiro_web_client.js"
        document.body.appendChild(_mscript);
        function sek_start(){
            function guid() {
                function S4() {
                    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
                }
                return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
            }
            var client = new SekiroClient("ws://127.0.0.1:5620/business-demo/register?group=test&clientId=" + guid());
            client.registerAction("ojbk", async function (request, resolve, reject) {
                try {
                    var e=request['url']
                    const s = window.encrypt(`${e}|${Math.floor(Date.now() / 1e3)}`);
    				const n = await Ut(`/v2/jx1`, s, "POST");
    				if (n.code == 200) {
    		           var sss = window.decrypt(n.url);
    	            }
    				var jsonResult = {url:sss}
    				console.log(JSON.stringify(jsonResult));
                    resolve(JSON.stringify(jsonResult));
                } catch (e) {
                    reject("error: " + e);
                }
            });
        }
        setTimeout(sek_start,2000)
    })();
    

    然后把断点取消掉,直接点放行,注意网页别关闭

    3 、直接就拿到真实地址了

    import requests
    
    r=requests.Session()
    pdata={
        'group':'test',
        'action':'ojbk',
        'url':'https://v.qq.com/x/cover/mzc002003rpvd4j/w0046a3hh1v.html'
    }
    
    response=requests.get("http://127.0.0.1:5620/business-demo/invoke",params=pdata)
    print(response.text)
    

    4 、进阶的玩法

    把框架部署到服务器,那个 F12 别关,就可以一直薅它的 API 接口了,

    上面 js 脚本也可通过别的方式注入,例如油猴之类

    所谓的最强加密播放器也不是没办法破解

    11 条回复    2023-09-04 15:12:38 +08:00
    danbai
        1
    danbai  
       2023-08-22 18:01:22 +08:00
    MeMoDiv
        2
    MeMoDiv  
       2023-08-22 18:21:12 +08:00
    围观吃瓜
    hsuehly
        3
    hsuehly  
       2023-08-22 18:32:57 +08:00
    如果上 debugger 断点你怎么办
    kuanat
        4
    kuanat  
       2023-08-22 19:44:39 +08:00
    RPC 对于没有混淆的代码来说很好用。


    @hsuehliuyang 过 debugger 方法太多了,浏览器内的话方法重载、条件断点、源文件 overrride 都行。浏览器之外的话,重编译一个修改了 js 引擎 debugger 方法的版本。
    gzlock
        5
    gzlock  
       2023-08-22 20:08:47 +08:00
    @hsuehliuyang #3 debugger 的断点功能 在开发者工具里可以禁用的
    以 edge 为例,最右的按钮点下去后,debugger 的断点功能就废了
    https://dd.ci/file/69df3e23a66ebaa496ee0.png
    bigha
        6
    bigha  
    OP
       2023-08-22 20:14:44 +08:00
    @hsuehliuyang

    上面两个大佬都说了,过 debugger 的方法确实很多,这里就总结下遇到的各种类型吧

    1 、时间类型,就是判断你打开 F12 时间,如果停留几秒,马上关闭你浏览器

    解决:这种调试时直接修改下时间就能解决

    2 、代码里穿插各种的 debugger ,各种乱入

    解决:js 全局替换掉 debugger 关键字 ,然后源文件 overrride

    3 、打开 F12 就开始疯狂往内存里写东西,然后让你浏览器卡死

    解决:从加载 js 代码就开始调试,慢慢找到相关代码,然后按照上面大佬说的搞掉

    4 、常规的 debugger hook 方法

    ```
    Function.prototype.constructor_ = Function.prototype.constructor;
    Function.prototype.constructor = function (a) {
    if(a == "debugger") {
    return function (){};
    }
    return Function.prototype.constructor_(a);
    };
    ```
    hsuehly
        7
    hsuehly  
       2023-08-22 20:15:27 +08:00 via iPhone
    @gzlock 学到了,但是 op 发的方法好像调用不了几次就不行了
    bigha
        8
    bigha  
    OP
       2023-08-22 22:02:29 +08:00
    @hsuehliuyang

    估计后端有啥限制,目测是请求 10 次就不行了

    用下面这个代码替换掉 [https://img.huxiucdn.com/article/content/202308/19/230935899090.js]

    https://code.ping8.top/KOJuh-yUAZc/raw

    然后随便打开个播放页,用油猴让网页 30 秒自动刷新一次即可
    chancat
        9
    chancat  
       2023-08-23 16:26:59 +08:00 via Android
    看看干嘛的
    yyf1234
        10
    yyf1234  
       2023-09-02 22:38:07 +08:00 via iPhone
    @hsuehliuyang 这个算法挺复杂的,前 9 个字节是 3 固定➕6 随机,真正的密文是后面的,
    每 16 个字节一组经过了两次变换,中间各种查表位运算,应该是凯撒密码的变种?
    不得不说 wasm 让前端逆向难度上升了许多,跟汇编差不多,但指令比汇编少
    hsuehly
        11
    hsuehly  
       2023-09-04 15:12:38 +08:00
    @yyf1234 大佬是如何看出前 9 个是随机的呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5645 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:46 · PVG 16:46 · LAX 00:46 · JFK 03:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.