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

打开 F12
抓包, 定位目标 API

可以看到加密参数再 URL
的 Params
里面

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

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

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

点进去发现居然是这样的一段代码,也就是 jsvmp
,JSVMP
全称 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
就生成完毕了!


所以我们在 SFSzs
到 DFSzsw
之间可以下一个断点来逐步分析,这种情况下可以插桩下一个断点
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
为一个函数,也就是 charAt
,P
经过赋值之后就是 "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe="
,根据逻辑会走到第一个 else
里面去,所以 O[++S] = P.apply(m, w)
就相当于执行代码 "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=".charAt(18)
,结果就是 w
根据日志分析一下就可以看出来了

所以该算法就是有一个 table
为 Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=
,每次都取 O
里面的第六号元素,然后与之前的结果拼起来。
那么我们接下来需要分析的就是这个 table
是怎么来的,然后 O
里面的第六号元素是怎么来的,因此我们需要逐步分析!
最后更新于
这有帮助吗?