分析网站:https://www.newrank.cn/ranklist/gongzhonghao
这次我们要分析的是该网站的接口 文化 按钮中的nonce
和xyz
参数。
注意:
一定要点击文化按钮进行请求数据,我已经吃了大亏,一开始点击了文化按钮进行抓包,找到如下数据包后,开始debug测试时,点击刷新,一直进不了debug,搞得我以为这个网站的加密升级到进制debug,在这里浪费了好长时间(当然,最开始也有因为用关键词搜索时找到了干扰的js文件,这里还是看了https://blog.youkuaiyun.com/qq_64095740/article/details/141093492这篇文章,学到了一个根据调用堆栈找到js文件,再用关键关键词搜索的技巧,才顺利的找到核心加密代码),到处找教程,最后偶然点了一次文化按钮进行请求,发现可以进debug。
1、发送请求
打开网页https://www.newrank.cn/ranklist/gongzhonghao
点击F12,来到网络,先清空数据,然后点击文化按钮,可以看到我们会发送一个请求
如果进入网页后,直接来到网络这里,然后发送请求的话会有大量的干扰包,不利于我们找到有用的数据包。
2、查看数据包
查看数据包,找到要破解的密文nonce、xyz
3、点击栈跟踪
通过观察可以发现
这里主要涉及到的js文件有
然后我们点击调试器中的
将代码展开
4、关键词搜索
ctrl+f 进入在文件中查找,输入关键词xyz,或nonce
在该文件中找到关键代码,此时不用急,先把其余文件搜索完,然后发现其余文件中均没有该关键词。
这里提一下我最开始的做法,我是直接上来就ctrl+shift+f 关键词搜索,然后找到了很多跟上图一样的代码块,然后就在哪里测试,浪费了很多时间。
5、debug
在我们找的关键词位置打两个断点
然后点击文化按钮,点击刷新是不会发送这个请求的,也就不会进入这个断点调试
根据代码可以看到nonce是 c 得到的值,c做了一个随机数的操作
我们可以点击下一步就可以看到nonce的值
接着再看xyz的值b()®,调用了一个b函数,然后传入r
所以我们可以看一下r的值,在控制台输入r,我们就可以拿到r的值,
点击下一步,直到跳转到另一个js文件
一直点击下一步,会发现它带我们调用的是88970下的函数,这里会用比较长的时间。在循环时可以按住F11或F9(浏览器不同,下一步按键就不同)不松,看一看都调用了哪些函数
这些函数调用完后就会带我们回到关键词的代码那里
然后再控制台输入b()®会得到xyz的值
停止调试后,可以看到发送了请求数据,然后跟数据包中的xyz对比一下,是一样的,此时就确定了这是xyz和nonce加密的关键代码
6、扣代码
这一步也可以提前在测试nonce的值时做
我们将生成nonce的代码复制出来,运行该代码,得到值,由于是随机数,所以每次运行的nonce的值会不同
var c = Math.random().toString(16).slice( - 9);
return r += '&nonce='.concat(c),
a.nonce = c,
将r的值提出来
let r = "/nr/user/wx/getTempQrCode?AppKey=joker&scene=portal_login&type=1";
const nonce = Math.random().toString(16).slice(-9);// '&nonce=0f7c6816d'
// r += "&nonce=".concat(c);
console.log("获取nonce:", nonce);
然后再扣下xyz的代码,找到刚刚调用过的函数,可以直接将88970下的所有代码都复制下来,但是会有一些错误,仔细观察后,发现它只调用了**!function (o)**中的代码于是我将其中的代码全部复制下来
'use strict';
function i(e, t) {
var n = (65535 & e) + (65535 & t);
return (e >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n
}
function a(e, t, n, r, o, a) {
var u;
return i((u = i(i(t, e), i(r, a))) << o | u >>> 32 - o, n)
}
function u(e, t, n, r, o, i, u) {
return a(t & n | ~t & r, e, t, o, i, u)
}
function c(e, t, n, r, o, i, u) {
return a(t & r | n & ~r, e, t, o, i, u)
}
function s(e, t, n, r, o, i, u) {
return a(t ^ n ^ r, e, t, o, i, u)
}
function l(e, t, n, r, o, i, u) {
return a(n ^ (t | ~r), e, t, o, i, u)
}
function f(e, t) {
e[t >> 5] |= 128 << t % 32,
e[(t + 64 >>> 9 << 4) + 14] = t;
var n,
r,
o,
a,
f,
p = 1732584193,
d = - 271733879,
y = - 1732584194,
m = 271733878;
for (n = 0; n < e