记一次JS逆向-新榜数据nonce和xyz参数分析
这次我们要分析的是该网站的接口 文化 按钮中的nonce
和xyz
参数。
注意:
一定要点击文化按钮进行请求数据,我已经吃了大亏,一开始点击了文化按钮进行抓包,找到如下数据包后,开始debug测试时,点击刷新,一直进不了debug,搞得我以为这个网站的加密升级到进制debug,在这里浪费了好长时间(当然,最开始也有因为用关键词搜索时找到了干扰的js文件,这里还是看了https://blog.csdn.net/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的值会不同
javascript
var c = Math.random().toString(16).slice( - 9);
return r += '&nonce='.concat(c),
a.nonce = c,
javascript
将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)**中的代码于是我将其中的代码全部复制下来
javascript
'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.length; n += 16) r = p,
o = d,
a = y,
f = m,
p = u(p, d, y, m, e[n], 7, - 680876936),
m = u(m, p, d, y, e[n + 1], 12, - 389564586),
y = u(y, m, p, d, e[n + 2], 17, 606105819),
d = u(d, y, m, p, e[n + 3], 22, - 1044525330),
p = u(p, d, y, m, e[n + 4], 7, - 176418897),
m = u(m, p, d, y, e[n + 5], 12, 1200080426),
y = u(y, m, p, d, e[n + 6], 17, - 1473231341),
d = u(d, y, m, p, e[n + 7], 22, - 45705983),
p = u(p, d, y, m, e[n + 8], 7, 1770035416),
m = u(m, p, d, y, e[n + 9], 12, - 1958414417),
y = u(y, m, p, d, e[n + 10], 17, - 42063),
d = u(d, y, m, p, e[n + 11], 22, - 1990404162),
p = u(p, d, y, m, e[n + 12], 7, 1804603682),
m = u(m, p, d, y, e[n + 13], 12, - 40341101),
y = u(y, m, p, d, e[n + 14], 17, - 1502002290),
d = u(d, y, m, p, e[n + 15], 22, 1236535329),
p = c(p, d, y, m, e[n + 1], 5, - 165796510),
m = c(m, p, d, y, e[n + 6], 9, - 1069501632),
y = c(y, m, p, d, e[n + 11], 14, 643717713),
d = c(d, y, m, p, e[n], 20, - 373897302),
p = c(p, d, y, m, e[n + 5], 5, - 701558691),
m = c(m, p, d, y, e[n + 10], 9, 38016083),
y = c(y, m, p, d, e[n + 15], 14, - 660478335),
d = c(d, y, m, p, e[n + 4], 20, - 405537848),
p = c(p, d, y, m, e[n + 9], 5, 568446438),
m = c(m, p, d, y, e[n + 14], 9, - 1019803690),
y = c(y, m, p, d, e[n + 3], 14, - 187363961),
d = c(d, y, m, p, e[n + 8], 20, 1163531501),
p = c(p, d, y, m, e[n + 13], 5, - 1444681467),
m = c(m, p, d, y, e[n + 2], 9, - 51403784),
y = c(y, m, p, d, e[n + 7], 14, 1735328473),
d = c(d, y, m, p, e[n + 12], 20, - 1926607734),
p = s(p, d, y, m, e[n + 5], 4, - 378558),
m = s(m, p, d, y, e[n + 8], 11, - 2022574463),
y = s(y, m, p, d, e[n + 11], 16, 1839030562),
d = s(d, y, m, p, e[n + 14], 23, - 35309556),
p = s(p, d, y, m, e[n + 1], 4, - 1530992060),
m = s(m, p, d, y, e[n + 4], 11, 1272893353),
y = s(y, m, p, d, e[n + 7], 16, - 155497632),
d = s(d, y, m, p, e[n + 10], 23, - 1094730640),
p = s(p, d, y, m, e[n + 13], 4, 681279174),
m = s(m, p, d, y, e[n], 11, - 358537222),
y = s(y, m, p, d, e[n + 3], 16, - 722521979),
d = s(d, y, m, p, e[n + 6], 23, 76029189),
p = s(p, d, y, m, e[n + 9], 4, - 640364487),
m = s(m, p, d, y, e[n + 12], 11, - 421815835),
y = s(y, m, p, d, e[n + 15], 16, 530742520),
d = s(d, y, m, p, e[n + 2], 23, - 995338651),
p = l(p, d, y, m, e[n], 6, - 198630844),
m = l(m, p, d, y, e[n + 7], 10, 1126891415),
y = l(y, m, p, d, e[n + 14], 15, - 1416354905),
d = l(d, y, m, p, e[n + 5], 21, - 57434055),
p = l(p, d, y, m, e[n + 12], 6, 1700485571),
m = l(m, p, d, y, e[n + 3], 10, - 1894986606),
y = l(y, m, p, d, e[n + 10], 15, - 1051523),
d = l(d, y, m, p, e[n + 1], 21, - 2054922799),
p = l(p, d, y, m, e[n + 8], 6, 1873313359),
m = l(m, p, d, y, e[n + 15], 10, - 30611744),
y = l(y, m, p, d, e[n + 6], 15, - 1560198380),
d = l(d, y, m, p, e[n + 13], 21, 1309151649),
p = l(p, d, y, m, e[n + 4], 6, - 145523070),
m = l(m, p, d, y, e[n + 11], 10, - 1120210379),
y = l(y, m, p, d, e[n + 2], 15, 718787259),
d = l(d, y, m, p, e[n + 9], 21, - 343485551),
p = i(p, r),
d = i(d, o),
y = i(y, a),
m = i(m, f);
return [p,
d,
y,
m]
}
function p(e) {
var t,
n = '',
r = 32 * e.length;
for (t = 0; t < r; t += 8) n += String.fromCharCode(e[t >> 5] >>> t % 32 & 255);
return n
}
function d(e) {
var t,
n = [];
for (t = 0, n[(e.length >> 2) - 1] = void 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 y(e) {
var t,
n,
r = '0123456789abcdef',
o = '';
for (n = 0; n < e.length; n += 1) o += r.charAt((t = e.charCodeAt(n)) >>> 4 & 15) + r.charAt(15 & t);
return o
}
function m(e) {
return unescape(encodeURIComponent(e))
}
function h(e) {
var t;
return p(f(d(t = m(e)), 8 * t.length))
}
function v(e, t) {
return function (e, t) {
var n,
r,
o = d(e),
i = [],
a = [];
for (
i[15] = a[15] = void 0,
o.length > 16 &&
(o = f(o, 8 * e.length)),
n = 0;
n < 16;
n += 1
) i[n] = 909522486 ^ o[n],
a[n] = 1549556828 ^ o[n];
return r = f(i.concat(d(t)), 512 + 8 * t.length),
p(f(a.concat(r), 640))
}(m(e), m(t))
}
function g(e, t, n) {
return t ? n ? v(t, e) : y(v(t, e)) : n ? h(e) : y(h(e))
}
一开始也将这个函数复制了,运行后会报错,然后就删了
javascript
void 0 !== (r = (function () {
return g
}).call(t, n, t, e)) &&
(e.exports = r)
}(0)
根据之前调试时的发现,xyz调用b()®后第一个进入的是function g(e, t, n)

于是,直接修改为xyz = g®,运行
javascript
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);
r += "&nonce=8ddb1cb48";//固定nonce的值与发送的数据包一直进行测试
console.log("获取nonce:", nonce);
//var xyz = b()(r);
var xyz = g(r);
console.log("xyz: ", xyz)


OK,就是一样的,这两个参数破解成功。
新手第一次js逆向,用时一天。
感谢
https://blog.csdn.net/qq_64095740/article/details/141093492文章的帮助!!!!!