某志愿网js逆向
逆向过程分析与js代码扣取
请求头U-Sign数据
通过浏览器开发者工具可以看到返回数据的接口/youzy.dms.basiclib.api.college.query
添加XHR断点刷新浏览器会自动进入断点
查看具体请求数据,将断点定位到r = r.then(t.shift(), t.shift());
F8跳转到改断点位置,可以看到有5个方法
点击[[FunctionLocation]]:后的js查看方法,发现第一个方法里面有u-sign
将断点定位到u-sign,并将上一步的断点放开,F8定位到u-sign
-
发现u-sign由o方法生成
-
复制出url和data的值,data可以直接右键复制对象
data = {
"keyword": "",
"provinceNames": [],
"natureTypes": [],
"eduLevel": "",
"categories": [],
"features": [],
"pageIndex": 1,
"pageSize": 20,
"sort": 11
}
进入o方法,断点并执行
观察发现该方法,发现参数o只是做了一个拼接,数据加密由n(o)完成,i值为固定值,a值为请求参数
var i = "9SASji5OWnG41iRKiSvTJHlXHmRySRp1"
o = Object.keys(a).length > 0 ? "".concat(JSON.stringify(a), "&").concat(i) : "&".concat(i);
o = o.toLowerCase()
n(o)
进入n方法并断点
复制出方法并改成正常方法
// 防止重名改为exports123
exports123 = function(e, r) {
if (null == e)
throw new Error("Illegal argument " + e);
var n = t.wordsToBytes(a(e, r));
return r && r.asBytes ? n : r && r.asString ? o.bytesToString(n) : t.bytesToHex(n)
}
我们现在可以得到js
var i = "9SASji5OWnG41iRKiSvTJHlXHmRySRp1",
data = {
"keyword": "",
"provinceNames": [],
"natureTypes": [],
"eduLevel": "",
"categories": [],
"features": [],
"pageIndex": 1,
"pageSize": 20,
"sort": 11
},
uri = '/youzy.dms.basiclib.api.college.query'
exports123 = function(e, r) {
if (null == e)
throw new Error("Illegal argument " + e);
var n = t.wordsToBytes(a(e, r));
return r && r.asBytes ? n : r && r.asString ? o.bytesToString(n) : t.bytesToHex(n)
}
// 将a改为data
o = Object.keys(data).length > 0 ? "".concat(JSON.stringify(data), "&").concat(i) : "&".concat(i);
o = o.toLowerCase()
console.log(exports123(o))
执行发现t未定义,进入t 跳转到到wordsToBytes在r中,即t为r,将r复制出来并改名r123,并将t.wordsToBytes改为r123.wordsToBytes
r123 = {
rotl: function(e, t) {
return e << t | e >>> 32 - t
},
rotr: function(e, t) {
return e << 32 - t | e >>> t
},
endian: function(e) {
if (e.constructor == Number)
return 16711935 & r123.rotl(e, 8) | 4278255360 & r123.rotl(e, 24);
for (var t = 0; t < e.length; t++)
e[t] = r123.endian(e[t]);
return e
},
randomBytes: function(e) {
for (var t = []; e > 0; e--)
t.push(Math.floor(256 * Math.random()));
return t
},
bytesToWords: function(e) {
for (var t = [], r = 0, n = 0; r < e.length; r++,
n += 8)
t[n >>> 5] |= e[r] << 24 - n % 32;
return t
},
wordsToBytes: function(e) {
for (var t = [], r = 0; r < 32 * e.length; r += 8)
t.push(e[r >>> 5] >>> 24 - r % 32 & 255);
return t
},
bytesToHex: function(e) {
for (var t = [], r = 0; r < e.length; r++)
t.push((e[r] >>> 4).toString(16)),
t.push((15 & e[r]).toString(16));
return t.join("")
},
hexToBytes: function(e) {
for (var t = [], r = 0; r