标题: WEB前端逆向定位ts后处理代码 创建: 2024-06-30 16:27 更新: 2024-06-30 19:16 链接: https://scz.617.cn/web/202406301627.txt https://www.52pojie.cn/thread-1939582-1-1.html https://mp.weixin.qq.com/s/QC-hp-rDXnuaQlR0ZaRk3Q 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后处理的事儿,我说的是方法论。