3. 抖音 Web

加密定位

访问官网 抖音-记录美好生活 (douyin.com) ,随意选择一个视频,访问用户信息

打开 F12 抓包, 定位目标 API

可以看到加密参数再 URLParams 里面

尝试全局搜索一下,看看是否能搜索到这个参数的生成位置,找到了两个,那么我们打一下断点分析一下

发现没有断到,所以尝试一下 XHR 断点

打上了,发现 X-Bogus 就在其 openArgs 上,这个时候可以看一下调用堆栈,发现其发起 JSwebmssdk.es5.js ,所以 webmssdk.es5.js 这个文件应该就是我们需要分析的 js 文件了!

点进去发现居然是这样的一段代码,也就是 jsvmpJSVMP 全称 Virtual Machine based code Protection for JavaScript,即 JS 代码虚拟化保护方案。

加密分析

通过上一步我们可以定位到,发起 XHR 请求的函数为 webmssdk.es5.js 里面的 W 函数,在分析 JS 之前,可以将该段 js 使用插件进行一个反混淆,插件是 v_jstools, 地址为:cilame/v_jstools: 模仿着写一个开源的 chrome 插件,用来快速调试前端 js 代码。 (github.com)

还原后再使用浏览器自带的 js 替换功能来替换掉原来的 js,回到刚刚的加密处,发现此时的 m 已经有了加密参数

此时我们可以添加一下日志断点,因为现在加密参数再 m 里面,而分析代码又可以知道 m 来自于 O[S--] ,所以我们日志断点可以为:

"行号:562", "索引A", A, "索引S", S, "值O: ", JSON.stringify(O, function(key, value) {if (value == window) {return undefined} return value})

添加完之后刷新页面,并将控制台的日志保存下来,再尝试搜索加密的 Key

发现当 P 为 13, S 为 3 的时候,O 里面就有了 X-Bogus,我们继续看日志,首先找到这个参数第一次生成的地方,然后你会发现这个参数居然是一个一个慢慢叠加生成的,每次执行一次就会多一个字母,执行到最后我们需要的 X-Bogus 就生成完毕了!

![image-20230508165250325](https://ghproxy.com/https://raw.githubusercontent.com/KKKKKKKEM/picture/main//image-20230508165250325.png)

所以我们在 SFSzsDFSzsw 之间可以下一个断点来逐步分析,这种情况下可以插桩下一个断点

if (A==592 && S==5 && O[7] == 6 && O[2] == 'DFSzs') {debugger}

这里有一个嵌套的三元表达式,分析起来可能比较困难,因此我们可以改写一下便于理解!原来的代码为

(P = O[S--]).x === W ? P.y >= 1 ? O[++S] = $(a, P.c, P.l, w, P.z, m, null, 1) : (O[++S] = $(a, P.c, P.l, w, P.z, m, null, 0),P.y++) : O[++S] = P.apply(m, w)

可以改写为:

if (P.x === W){​    if (P.y >=1) {        O[++S] = $(a, P.c, P.l, w, P.z, m, null, 1)    } else {        O[++S] = $(a, P.c, P.l, w, P.z, m, null, 0),P.y++    }​}else {    O[++S] = P.apply(m, w)}   

此时断下来之后,我们可以知道 w[18]m 为一个函数,也就是 charAtP 经过赋值之后就是 "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=" ,根据逻辑会走到第一个 else 里面去,所以 O[++S] = P.apply(m, w) 就相当于执行代码 "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=".charAt(18),结果就是 w

根据日志分析一下就可以看出来了

所以该算法就是有一个 tableDkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=,每次都取 O 里面的第六号元素,然后与之前的结果拼起来。

那么我们接下来需要分析的就是这个 table 是怎么来的,然后 O 里面的第六号元素是怎么来的,因此我们需要逐步分析!

最后更新于

这有帮助吗?