逆向15-新东方


新东方搜课

1. 请求-响应分析

载荷-响应都是明文的,头信息中的sign是加密的
image

2. 入口分析

2.1 关键字定位\bsign\b

本次使用第二种
image

2.2 请求堆栈定位

image
定位之后,发起请求,看看能不能定位住
image
经过两步就可以定位住了
接下来分析代码吧
image
分析1
image
进去先看一下Ge函数
image
再去看一下ot函数
image
关于sign值,初步看是一个md5的值啊,验证一下吧
image
通过123456的md5值我们确认是一个标准的md5值

3. 扣代码

  1. 扣s
    image
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. 报错1 ot is not defined
    image
    扣ot并继续

  2. 报错2 Ge is not defined
    image
    扣Ge并继续

  3. 报错3Qe is not defined
    image

  4. 报错4u is not defined
    image

  5. 报错5u is not defined
    image
    扣u函数
    image

  6. 报错6Ye is not defined
    image
    image
    解决办法-直接替换
    image

  7. 报错7Je is not defined
    image

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

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
}

posted @ 2024-08-09 15:17  流年中渲染了微笑  阅读(0)  评论(0)    收藏  举报