分析加密參數
網址: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])