出租車駕駛員從業資格考試平台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])

結果展示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM