前言
该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~
需求
Base64编码:
目标网站:aHR0cHM6Ly93d3cuemhpaHUuY29tL3RvcGljLzE5NTUwMjI4L2hvdA==
端口:aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NS4xL3RvcGljcy8xOTU1MDIyOC9mZWVkcy9lc3NlbmNlP29mZnNldD0yMCZsaW1pdD0xMCY=
JS分析
请求头分析
请求头中x-zse-96参数为目标
全局搜索 x-zse-96
发现请求头中x-zse-96参数的设置位置,参数已经生成完毕,“2.0_”为固定值,【E】为前文生成的S.signature。
逆向分析S.signature
字符串s分析
在这里下个断点,然后重新发包。
逐个分析这些变量:
var o = n.zse93 // '101_3_3.0', 固定值。请求头中参数x-zse-93的值
i = n.dc0 // 'AFAT7mekYRaPToYbyTTorNjS4DDkeF-A-7Q=|1677289779',cookie中d_c0的值
a = n.xZst81 // 请求头中x-zst-81的值, 固定不变,可以为空,不用管
u = z(t) // '/api/v5.1/topics/19550228/feeds/essence?offset=30&limit=10&',请求地址
c = G(e) // 空,不用管
s = [o, u, i, V(c) && c, a].filter(Boolean).join("+");
// 将上述变量值进行字符串拼接,'3_2.0aR_sn77yn6O92wOB8hPZnQr0EMYxc4f18wNBUgpTQ6nxERFZYRY0-4Lm-h3_tufIwJS8gcxTgJS_AuPZNcXCTwxI78YxEM20s4PGDwN8gGcYAupMWufIeQuK7AFpS6O1vukyQ_R0rRnsyukMGvxBEqeCiRnxEL2ZZrxmDucmqhPXnXFMTAoTF6RhRuLPF0XKFDxCr6Nqiuwxjq2G1wpKNrUYwBLsWD3LfUoCQcHGe8S_khXf5gwG6rrTvMo9obemBAeCCDuYHBHxJwXfhCxywC39DUVVbTpK1rLmNh3_Ah3M9vC1dUpy6eLfNBHx2hLChvXLe0HC2iwmoGOK3gtqV9H8FJeLo_C_bwL0QDr_fwH9VqfzdcSGuvS0ZCSsWgeCAu21uucMFUY_sBHGyGVyahCqh9pY89Xm0bSLsgOL6UoK3gXOAJNGZvo8qucBYUc0s8eGevLYbMVs2HwOUgVqLD91twt8Q0e8BrSC'
加密分析
在这里下断点,然后重新发包。
source: s
signature: P(r).encrypt(f()(s))
signature为加密值,每次加密的结果均不同。
f (s)分析
可以看出为两层加密,先看里层的f()(s)
值是固定的,长度为32位,盲猜MD5加密。
加密1试试,和在线加密对比,确定f()为MD5加密。
外层 P(r).encrypt() 分析
每次加密结果均不同。
进入加密函数,跳转到这里。传参t为MD5加密的s。整个文件为webpack的分包,把这个模块扣下来。
扣下来后,本地运行报错,控制台可以,说明本地缺少环境。
补了window环境后可以正常运行,得到相似的结果,但由于每次加密结果不同,无法确定结果是否正确。
将Math.random的返回值固定,加密结果固定,对比扣下来的和浏览器控制台的输出结果,发现结果不同。
插桩调试后,发现是环境缺失导致的。
通过挂代理补完环境,结果一致。
Python代码
后文
作者微信号:Sruiis,欢迎联系作者交流更多