
图源:AI绘画
aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vZmlybS9pbmZvLzFuVl8ydGt+Lmh0bWw=
刷新页面可以看到下面的请求包

有两个加密参数并且返回值也是加密的

定位比较简单,全局搜索就可以了

全局检索 kiv,找到下面的代码位置,可以看到 b 和 kiv 在这里赋值

打上断点,然后刷新页面
找到我们要分析的请求位置

可以看到a = (0,M._A)(), 单步进去可以看到下面的逻辑
for (var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""), n = "", r = 0; r < 16; r++) {
n += t[Math.ceil(61 * Math.random())]
}
这里的 kiv 的值就是一个随机数
继续分析 b 的加密,往下分析可以看到 b 由 t 赋值得到
t 的逻辑如下
t = (0,M.mA)(n, {iv: a}).replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~")))
这里 t 的加密用到了上面生成好的 a,单步进去可以看到 mA中是一个 AES加密

既然知道是 AES 就继续向下分析 AES 的key、模式、还有填充方式三个要素
这三个要素都是从 n 中获取到的,而 n 是由 u() 得到的,所以单步进 u 分析
可以看到 u 中写的很明白 AES 的加密三要素

这里的 e 为固定的加密 key (隐藏关键位置,如有需要请自行分析)
G*************r
知道上面分析的几个要素之后,我们本地用 Python 测试一下看看


带入Python请求中测试一下能否请求成功

可以正常获取到结果
加密的数据的解密可以通过
1、搜索判断请求状态码为 200
2、直接在上面 AES 的加密位置的下方就可以找到的 AES解密的部分代码打上断点之后从堆栈往上找就可以找到了

这个逻辑其实在上面我们已经分析过了,key 还是原来的那个,iv 部分变成我们提交请求的 kiv 即可
验证一下整个流程

上就是今天的全部内容了,咱们下次再会~