出租车驾驶员从业资格考试平台js逆向

分析加密参数

网址:aHR0cHM6Ly90YXhpLmp0enl6Zy5vcmcuY24vQ1pDSlNZL0xFQVAvY3pjanN5L2h0bWwvcHVibGljUXVlcnkuaHRtbD9DT0xMQ0M9MjY5NDUwNzQ3OQ==

目的:获取数据:驾校名称、驾校地址、驾校负责人、负责人电话、剩余位置


1、找到数据来源


数据来源找到,查看哪些加密参数是变化的,哪些是不变的

可以看到data、version、service都是变化的


2、加密函数破解


此处使用的是查找堆栈分析:

直接进入堆栈后打断点,翻页

可以看到a.data中就有我们需要的数据,向上找堆栈,发现向上两层找到需要的数据,打上断点

从图中可以看出service、version、data实际是,e、t、n都经过r函数加密得到加密值,因此只需要找到r函数就行

此处的e为固定值:LTPUCZC_getExamPlace 

t为固定值:1.0.0

n为拼接值:"{"bean":{"pagesize":8,"pagenum":"1","areaid":"-1"}}" pagenum为页数(变化)


进入r函数


这不就是一个DES加密嘛,废话不多说,代码码起,先测试一下service的值是否一致

CryptoJS = require("crypto-js");

function r(e) {
        var t = CryptoJS.enc.Utf8.parse("longrise211thsssdsaqqas");
        return CryptoJS.DES.encrypt(e, t, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        }).toString()
    }
console.log(r("LTPUCZC_getExamPlace"));

service: "RO$vH/+6&cXggomKzq+n007MY0my+R43UV@MhE7Uf4Bu0VARgcsUtipfO90Y$l7M"

这结果比实际结果(64位)要短,那只能说明,别人改写了加密函数

扣代码

既然不能直接使用CryptoJS,那只能扣代码了

点击函数进入对应的位置:

将代码全部扣下来,放在notepad++,找到11277行,上下观察,发现7529-13755行都是在对CryptoJS重写,直接扣下来,运行

结果64位,正确,加密分析结束

代码编写

import execjs
import requests
import json
import csv

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36",
   }
session = requests.session()
session.headers = headers
url = "https://taxi.jtzyzg.org.cn/CZCJSY/restservices/http/single/query"

with open('taxi_des.js', encoding="utf-8") as f:
    exec = f.read()
js = execjs.compile(exec)

# 存储位csv
f = open('驾校信息.csv','a',encoding='utf8',newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['驾校地址','联系人电话','联系人','座位数','驾校名称'])

# 构建请求体
def return_data(pagenum):
    data = '{"bean":{"pagesize":8,"pagenum":"'+str(pagenum)+'","areaid":"-1"}}'
    return {
        "service": js.call('r', "LTPUCZC_getExamPlace"),
        "version": js.call('r',"1.0.0"),
        "data": js.call('r',data)
    }

for i in range(1,3):
    ret = session.post(url, data=json.dumps(return_data(i))).json()

    for item in ret.get('result').get('result').get('result'):
        address = item.get('address')
        linktel = item.get('linktel')
        linkperson = item.get('linkperson')
        seatnum = item.get('seatnum')
        examroomname = item.get('examroomname')
        csv_writer.writerow([address, linktel,linkperson, seatnum, examroomname])

结果展示

posted @ 2021-11-21 22:59  是四不是十  阅读(345)  评论(0编辑  收藏  举报