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
[ 完 ]