出租车驾驶员从业资格考试平台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])