逆向15-新东方
新东方搜课
1. 请求-响应分析
载荷-响应都是明文的,头信息中的sign是加密的

2. 入口分析
2.1 关键字定位\bsign\b
本次使用第二种

2.2 请求堆栈定位

定位之后,发起请求,看看能不能定位住

经过两步就可以定位住了
接下来分析代码吧

分析1

进去先看一下Ge函数

再去看一下ot函数

关于sign值,初步看是一个md5的值啊,验证一下吧

通过123456的md5值我们确认是一个标准的md5值
3. 扣代码
- 扣
s

let l = {
"keyword": "%E8%8B%B1%E8%AF%AD",
"order": "0",
"pageIndex": 1,
"pageSize": 12
}
s = ot(Ge({cityCode: "110100"}, l))
console.log(s)
-
报错1
ot is not defined

扣ot并继续 -
报错2
Ge is not defined

扣Ge并继续 -
报错3
Qe is not defined

-
报错4
u is not defined

-
报错5
u is not defined

扣u函数

-
报错6
Ye is not defined


解决办法-直接替换

-
报错7
Je is not defined

直到这里我们感觉看到了光,je函数不就是md5值吗---------完全可以自己写

4. 总代码
python
import requests
import execjs
url = "https://dsapi.xdf.cn/product/v2/class/search?"
js_compile = execjs.compile(open('./xdf.js').read())
data = {
"keyword": "%E8%8B%B1%E8%AF%AD",
"order": "0",
"pageIndex": 1,
"pageSize": 12
}
data_obj = js_compile.call('getSign', "110100", data)
sign = data_obj['sign']
params = data_obj['params']
payload = {}
headers = {
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7',
'cache-control': 'no-cache',
'content-type': 'application/json',
'origin': 'https://souke.xdf.cn',
'pragma': 'no-cache',
'priority': 'u=1, i',
'referer': 'https://souke.xdf.cn/search?cityCode=110100&kw=%E8%8B%B1%E8%AF%AD',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'sign': sign,
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
}
response = requests.request("GET", url + params, headers=headers, data=payload)
print(response.text)
JS
const CryptoJS = require('crypto-js');
ot = function(e) {
var t = "appId=".concat(5053, "&t=").concat((new Date).getTime());
for (var n in e)
String(e[n]) && void 0 != e[n] && null != e[n] && "undefined" != e[n] && "null" != e[n] && (t = "".concat(t, "&").concat(n, "=").concat(e[n]));
return {
params: t,
// sign: Je("".concat(t).concat(Ye.b))
sign: CryptoJS.MD5("".concat(t).concat("750F82C2-D8F6-49F6-878C-1E7EBEBC8DA2")).toString()
}
}
function Ge(e) {
for (var t = 1; t < arguments.length; t++) {
var n = null != arguments[t] ? arguments[t] : {};
t % 2 ? Qe(Object(n), !0).forEach((function(t) {
Object(n1)(e, t, n[t])
// Object(u.a)(e, t, n[t])
}
)) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Qe(Object(n)).forEach((function(t) {
Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t))
}
))
}
return e
}
// function n(e, t, r) { // 防止冲突,改一个独一无二的名字
function n1(e, t, r) {
return t in e ? Object.defineProperty(e, t, {
value: r,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[t] = r,
e
}
function Qe(e, t) {
var n = Object.keys(e);
if (Object.getOwnPropertySymbols) {
var r = Object.getOwnPropertySymbols(e);
t && (r = r.filter((function(t) {
return Object.getOwnPropertyDescriptor(e, t).enumerable
}
))),
n.push.apply(n, r)
}
return n
}
function getSign(cityCode, data){
s = ot(Ge({cityCode: cityCode}, data))
return s
}

浙公网安备 33010602011771号