遇一人,山水有逢,念一人,风过轻澜;执一人,潋水之滨,终一人,悱恻至生。
![12d2df935f5d8ec9031fb608eb4ff14a.png](https://img-blog.csdnimg.cn/img_convert/12d2df935f5d8ec9031fb608eb4ff14a.png)
1、前言
一、目标网站aHR0cHM6Ly93d3cucWltYWkuY24vcmFuaw==。
定时采集每日榜单信息
二、加密逻辑
简单概括下加密逻辑,结合下面的详细分析,可以很好的读懂文章。
第一,使用拦截器,拦截请求url和请求携带的参数
第二,对参数进行排序并使用base64加密
第三,拼接加密后的参数、url、以及其他字符串,经过js加密后继续base64加密生成analysis。
2、定位拦截器
接口分析直接忽略了,很简单,刷新页面即可以见到。
截个图说明下需要分析的加密参数即为analysis。
3、加密逻辑分析
观察加密js代码,分别在下图红点位置设置断点。
由于页面接口参数全部要经过拦截器加密,所以在继续向下调试前,要优先把入参n的url调试到与接口url一致,不然就没办法继续向下分析了。
继续向下进入到return中,单步调试,观察变化,调试到第一次s生成的位置暂停。
如下图所示,全选后可以看到s的值,分别查看AF=sort,jl=join,l='',很明显,逻辑就是对传递进来的参数进行sort排序,然后拼接。
继续向下调试,整体选中后出现了调用方法S(n),参数n就是s的值。
结果如下,完全一致。
查看s的生成逻辑,鼠标移动到每个变量上查看对应值,n[ka][Ip](n[Grn], l)的结果为url路径,z的值是@#,f值是1,r的值为一串数字,s的值如下图由字符串拼接而成,L经过多次调试,发现也为固定值。
向上查看r生成的位置,如下图,计算逻辑很明显,new t[R]的值为当前时间戳,减去555,继续减去一个固定值。
参数部分寻找完毕!
接着看一下,生成i时,涉及了哪些方法?
图一,外层调用S(n),上面已经分析过了,使用的是base64加密
图二,内部调用j(t, n),参数t,n的值分别为s, L。
接着分析j(t, n),代码如下,看起来很绕,果断用执行js来实现。查看参数并在原代码基础上,替换已知参数。
修改后的j函数如下
function j(t, n) { n || (n = d()), t = t.split(""); for (var a = t.length, e = n.length, r = "charCodeAt", i = 0; i < a; i++) t[i] = u(t[i][r](0) ^ n[(i + 10) % e][r](0)); return t.join("") }
而修改后的代码,需要补全d(),u(n)两个函数。
d()原代码如下图
function d() { return unescape("861831832863830866861836861862839831831839862863839830865834861863837837830830837839836861835833".replace(/8/g, "%u00")) }
u(n)原代码如下图
function u(n) { var t = "fromCharCode" return String[t](n) }
代码的修改只是更换了另一种写法,替换了已知的值,修改后的js可以不一样,但必须保证测试通过。
接着开始测试j(t, n)
网页中生成的结果如下图
ok,到这里分析完毕。
其实base64加密部分js代码也是可以扣出来的,有兴趣的可以试一下,不是很难。
4、代码展示
分析了这么多,其实加密部分实现起来也就那么几行代码,如下图所示。![37af691de828e8df1b30fa4dc9b08bd2.png](https://img-blog.csdnimg.cn/img_convert/37af691de828e8df1b30fa4dc9b08bd2.png)
对你有帮助,请扫码关注!感谢!
![187daaec089e6ca07bf8ad1c0d164e93.png](https://img-blog.csdnimg.cn/img_convert/187daaec089e6ca07bf8ad1c0d164e93.png)
公众号:逆向旅行
微信号:fzcoder888888
定期分享Python进阶技术,爬虫
str4表示client_ver