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

2023-08-22 17:48:59 +08:00
 bigha

关联的帖子在这里

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 脚本也可通过别的方式注入,例如油猴之类

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

3025 次点击
所在节点    程序员
11 条回复
danbai
2023-08-22 18:01:22 +08:00
MeMoDiv
2023-08-22 18:21:12 +08:00
围观吃瓜
hsuehly
2023-08-22 18:32:57 +08:00
如果上 debugger 断点你怎么办
kuanat
2023-08-22 19:44:39 +08:00
RPC 对于没有混淆的代码来说很好用。


@hsuehliuyang 过 debugger 方法太多了,浏览器内的话方法重载、条件断点、源文件 overrride 都行。浏览器之外的话,重编译一个修改了 js 引擎 debugger 方法的版本。
gzlock
2023-08-22 20:08:47 +08:00
@hsuehliuyang #3 debugger 的断点功能 在开发者工具里可以禁用的
以 edge 为例,最右的按钮点下去后,debugger 的断点功能就废了
https://dd.ci/file/69df3e23a66ebaa496ee0.png
bigha
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
2023-08-22 20:15:27 +08:00
@gzlock 学到了,但是 op 发的方法好像调用不了几次就不行了
bigha
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
2023-08-23 16:26:59 +08:00
看看干嘛的
yyf1234
2023-09-02 22:38:07 +08:00
@hsuehliuyang 这个算法挺复杂的,前 9 个字节是 3 固定➕6 随机,真正的密文是后面的,
每 16 个字节一组经过了两次变换,中间各种查表位运算,应该是凯撒密码的变种?
不得不说 wasm 让前端逆向难度上升了许多,跟汇编差不多,但指令比汇编少
hsuehly
2023-09-04 15:12:38 +08:00
@yyf1234 大佬是如何看出前 9 个是随机的呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

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

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX