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

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

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

2717 次点击
所在节点    程序员
11 条回复
danbai
268 天前
MeMoDiv
268 天前
围观吃瓜
hsuehly
268 天前
如果上 debugger 断点你怎么办
kuanat
268 天前
RPC 对于没有混淆的代码来说很好用。


@hsuehliuyang 过 debugger 方法太多了,浏览器内的话方法重载、条件断点、源文件 overrride 都行。浏览器之外的话,重编译一个修改了 js 引擎 debugger 方法的版本。
gzlock
268 天前
@hsuehliuyang #3 debugger 的断点功能 在开发者工具里可以禁用的
以 edge 为例,最右的按钮点下去后,debugger 的断点功能就废了
https://dd.ci/file/69df3e23a66ebaa496ee0.png
bigha
268 天前
@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
268 天前
@gzlock 学到了,但是 op 发的方法好像调用不了几次就不行了
bigha
268 天前
@hsuehliuyang

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

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

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

然后随便打开个播放页,用油猴让网页 30 秒自动刷新一次即可
chancat
267 天前
看看干嘛的
yyf1234
257 天前
@hsuehliuyang 这个算法挺复杂的,前 9 个字节是 3 固定➕6 随机,真正的密文是后面的,
每 16 个字节一组经过了两次变换,中间各种查表位运算,应该是凯撒密码的变种?
不得不说 wasm 让前端逆向难度上升了许多,跟汇编差不多,但指令比汇编少
hsuehly
255 天前
@yyf1234 大佬是如何看出前 9 个是随机的呢

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

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

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

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

© 2021 V2EX