js逆向實戰之數位觀察響應資料解密

死不悔改奇男子發表於2024-04-30

url:https://www.swguancha.com/home/city-detail?code=310100

分析過程

  1. 抓資料包,發現回顯資料是加密字串。
    image

  2. 對於這種回顯資料解密,大機率透過攔截器實現,搜尋interceptors
    image

  3. 只需關注響應攔截器,一共兩處。

  • 第一處,只是對字串的彈出和插入操作,不是。
    image
  • 第二處,可以看到decryptAES關鍵字了,解密邏輯就在這裡了。
    image
  1. 打斷點,重新整理介面。
    image
    看下t.datakeyivmode的值。
    t.data就是資料包的回顯資料。
    image
    key=n=u.enc.Utf8.parse(l)l是在上面定義的常量。
    image
    mode透過mode: u.mode.ECB可得到是ECB模式。
    iv就不需要了。

  2. 編寫python程式碼獲取資料。

import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64


url = "https://app.swguancha.com/client/v1/cPublic/consumer/property/type/search?level=2"
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                                                 "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 "
                                                 "Safari/537.36", "Referer": "https://www.swguancha.com/"})
mi_str = resp.text.replace(" ", "")     # 響應資料有空格,需進行處理

key = "QV1f3nHn2qm7i3xrj3Y9K9imDdGTjTu9".encode("utf-8")
aes = AES.new(key=key, mode=AES.MODE_ECB)
ming_str = aes.decrypt(base64.b64decode(mi_str))
ming_str = unpad(ming_str, 16)
print(ming_str.decode("utf-8"))

執行結果如下
image

  1. 也可以透過python呼叫js的程式碼實現。

var CryptoJS = require("crypto-js");

var l = "QV1f3nHn2qm7i3xrj3Y9K9imDdGTjTu9";

function decrypt(t) {
    var n = CryptoJS.enc.Utf8.parse(l)
        , r = CryptoJS.AES.decrypt(t, n, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    })
        , i = r.toString(CryptoJS.enc.Utf8)
        , s = JSON.parse(i);
    return s;
}

from functools import partial
import subprocess

subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")

import requests
import base64
import execjs


url = "https://app.swguancha.com/client/v1/cPublic/consumer/property/type/search?level=2"
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                                                 "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 "
                                                 "Safari/537.36", "Referer": "https://www.swguancha.com/"})
mi_str = resp.text.replace(" ", "")     # 響應資料有空格,需進行處理
file_object = open("解密.js", mode="r")
exec_code = file_object.read()
exec_js = execjs.compile(exec_code)
res = exec_js.call("decrypt", mi_str)
print(res)

執行結果如下
image

相關文章