长亭百川云 - 文章详情

WEB前端逆向定位ts后处理代码

青衣十三楼飞花堂

65

2024-07-13

创建: 2024-06-30 16:27更新: 2024-06-30 19:16https://scz.617.cn/web/202406301627.txt

WEB前端逆向初学者的若干备忘。

m3u8+ts是视频网站常见套路。大致是混淆js,隐藏m3u8的实际构造过程,下载加密过的m3u8,解密,下载异化过的ts,js还原ts,播放。中间可能动用wasm,也可能不动用,当它是个动态链接库好了,不影响整体流程。下载m3u8的URL可能并无m3u8字样,下载wasm的URL可能并无wasm字样,这些都是常见套路。但Network面板会暴露这些蝇营狗苟,不管下载ts的URL有无ts字样,你看它扑棱扑棱地下,这本身就是强特征,太扎眼,那前面大概率有m3u8下载。从Initiator的调用栈回溯看过去,若没有混淆就放过,谁有混淆谁就是嫌犯,甭管是不是下载m3u8,反混淆调一拨,必有所获。从逆向工程角度看,扎眼的保护措施是逆向目标强指示。

大部分时候对m3u8的保护最强,对ts和wasm的保护一般。若ts经私有异化处理,即便猜中反异化套路,好奇心强的也不大满意,总想看到实实在在的反异化处理代码,用人话说,想在下载ts后调试跟踪到ts后处理代码所在。

参看

《WEB前端逆向随笔》

https://scz.617.cn/web/202406251509.txt

常规套路是拦截XHR或Fetch,拦请求。若是Fetch,直接在代码下方找then之类的块。若是XHR,假设是h.send(),在h中找onreadystatechange之类的,设断,命中。这两种情形对于调试者无需区分什么,后面只说XHR的情形,就从onreadystatechange说起。从这儿开始单步,就比较扯淡了,有些复杂的,基本绕晕。但我们只关注ts后处理不是?而且你碰到的,是不是大概率用到HLS的某个js?假设叫hls.js吧。

在HLS (HTTP Live Streaming)中,demux是demultiplexing(解复用)的缩写。解复用是指将多路复用的媒体流(包含视频、音频、字幕等不同的媒体轨道)分离成独立的轨道,以便进行进一步处理或播放。这GPT忽悠我的,要点是,demux与ts后处理相关。

在hls.js中直接搜"demux",可能有多个命中,找一个形如这种的:

x.postMessage({    cmd: "demux",    /*     * data是加密状态的ts     */    data: t,    /*     * decryptdata这种key名很扎眼     */    decryptdata: m,    ...})

形如这种的命中应该只有一个,这就是要开始处理ts了。在这儿设断,命中,调用栈回溯,有些复杂的,离onreadystatechange可远了,中间某些帧不是单步可以抓住要点的。在postMessage处F11 Step into,之后在Page中能看到一个新增的blob,在Network面板Name列会看到:

blob:https://…

blob的名字是个uuid,刷新后会变,其Type列是"text/javascript",这种是从内存动态加载的js,不走网络,ts后处理代码就在这种blob中。blob的源一般在hls.js中,但执行的是blob中的副本,而不是hls.js中的源。可在blob创建之前修改hls.js中的源,间接修改blob中的副本。拦截"URL.createObjectURL",查看调用栈回溯,定位blob创建代码。

Network面板看到blob,其前面那个请求一般是下载第0号ts。

可以调试blob中的代码。但没必要傻单步。在blob中继续搜"demux",会有个命中:

case "demux":

这个对应前面的

cmd: "demux"

在case处设断,执行,命中,从case处单步,这个时候就简单多了,不太可能绕晕。一般单步一会儿就能找到ts后处理代码,比如ts伪装成png时,去png头,比如ts经AES加密过,需要AES解密。找到ts后处理代码时,可以查看下载回来的原始ts数据,可以查看用于AES的key、iv等数据。它用的AES解密代码不一定是外部js库提供,可能就是blob中内置的完整的AES算法函数,可查看in/out,与"CyberChef/AES Decrypt"对一下。其他形式的ts后处理代码,理论上也能用这个办法快速定位,没碰上过,不好说。

我第一次碰上"demux",是ts伪装png头,虽然我找到了ts后处理代码,当时并不知道换一种ts异化处理该如何快速定位ts后处理代码,对HLS这些完全不了解。不过我有个记录调试过程的习惯,并不只记录调试结论,所以当时一些单步经过的点、一些调用栈回溯,我都记在TXT中。过了些日子,在另一个测试案例中碰上AES加密ts,我就合理推测,可能当时记录的内容中,有些关键点在新案例中同样存在。搜了搜postMessage,有好几个命中,当时没有意识到那只是不同cmd的postMessage,但在肉眼遍历时看到cmd为"demux"的postMessage,这就新旧对上了。接下来就好办了,设断,验证一下调用栈回溯,是不是大体类似。快速找到AES解密代码后,问GPT,demux有啥特殊,GPT给我一通忽悠,进一步对上。

逆向工程的许多东西,说穿了就两句话,说穿后一钱不值,没说穿前,难者不会。但有些东西,你说穿了千百遍,看客也未必明白真正的要点在哪里。上面这段,我说的不是ts后处理的事儿,我说的是方法论。

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2