逆向過程分析與js代碼扣取 請求頭U-Sign數據 通過瀏覽器開發者工具可以看到返回數據的介面/youzy.dms.basiclib.api.college.query 添加XHR斷點刷新瀏覽器會自動進入斷點 查看具體請求數據,將斷點定位到r = r.then(t.shift(), t.shift( ...
逆向過程分析與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