图源: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 即可
验证一下整个流程
上就是今天的全部内容了,咱们下次再会~