aHR0cHMlM0EvL3hkLm5ld3JhbmsuY24vZGF0YS90aWt0b2svcmFuay9vdmVyYWxs
这个网站是昨天在系列课的交流群里看到的,正好缺少案例就拿来练手了。
这里要分析的是指数排行榜
这一栏的数据
首先看下请求是怎么样的
看到这里分析的是xyz
与nonce
两个加密参数
1、直接检索是可以找到的,xyz
这个参数名称很有标志性
2、 通过xhr
断点分析,不过这个网站的xhr
分析的话,追堆栈很容易就追丢了。
接下来我们简单分析一下
先下一个断点,可以直接断在请求发出的位置
在这个位置,需要分析的参数已经全部生成好了,所以需要向上分析堆栈
因为有异步请求,所以先在下图这个位置打上断点,继续分析堆栈
继续不停的分析,断点重放请求,直到找到下面这个位置
在之前的文章有介绍过这个拦截器
的用法,所以这里就不再废话一遍了。
在这个位置继续追两步就到了加密位置了。
这里的i.a
就是我们具体的加密算法的位置了。
从上面一路追下来到了这个位置,可以看到传入的参数就是我们请求的url
而且加密的逻辑看似也非常简单,我们继续分析
先来看看nonce
的加密,打上断点追进去发现这个c
方法是一环套一环,让人有点难受,所以咸鱼偷懒了
经过多次刷新分析这个nonce
是由上面传入的i
数组随机生成的字符串,生成的长度就是9
,明白这个算法的实现之后,咸鱼直接百度了一个
function getRandomArrayElements(arr, count) {
var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
while (i-- > min) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(min);
}
var items = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
解决了nonce
之后,可以看到xyz
是由nonce
和上面的url
拼接生成并经有a
方法加密生成的,所以直接下上断点口一波代码
那么问题来了,这个代码要怎么扣?
先一步步跟着代码调试走一遍流程,然后开始顺着这个流程走过的地方,把他经过的代码都复制到编辑器当中,就像这样
先把这个g
复制过来
function g(e, t, n) {
return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}
然后追进去F11
,再复制m(e)
function m(e) {
return (function (e) {
return d(s(p(e), 8 * e.length));
})(v(e));
}
function g(e, t, n) {
return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}
然后再复制v(e)
function v(e) {
return unescape(encodeURIComponent(e));
}
function m(e) {
return (function (e) {
return d(s(p(e), 8 * e.length));
})(v(e));
}
function g(e, t, n) {
return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}
再复制下一个执行的函数
function p(e) {
var t,
n = [];
for (n[(e.length >> 2) - 1] = void 0, t = 0; t < n.length; t += 1)
n[t] = 0;
var r = 8 * e.length;
for (t = 0; t < r; t += 8)
n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
return n;
}
function v(e) {
return unescape(encodeURIComponent(e));
}
function m(e) {
return (function (e) {
return d(s(p(e), 8 * e.length));
})(v(e));
}
function g(e, t, n) {
return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}
扣代码就是不停的重复,如果你不小心跟丢了,那就重新来过,再调试,最好要结合console.log
方法穿插的调试
重复这个过程,直到你在webstorm
中执行g
不会提示错误为止,
如果报错了,你就把报错粘贴到谷歌翻译里翻译一下,认真百度一下,然后再认真看看是不是括号没复制全啊,变量名是不是重复啊等等问题,这个加密真的不难啊
最后再结合前面的nonce
的方法你就会得到下面这个结果
这个时候就可以把这个js
拿去Python
里面调用了。
偷懒直接拿postman
生成一下请求的代码,把参数修改成从js
生成就可以了。
直接上结果
完事儿~
以上就是今天的全部内容啦,咱们下次再会~
Love&Share
[ 完 ]