url:https://www.swguancha.com/home/city-detail?code=310100
分析過程
-
抓資料包,發現回顯資料是加密字串。
-
對於這種回顯資料解密,大機率透過攔截器實現,搜尋
interceptors
。
-
只需關注響應攔截器,一共兩處。
- 第一處,只是對字串的彈出和插入操作,不是。
- 第二處,可以看到
decrypt
和AES
關鍵字了,解密邏輯就在這裡了。
-
打斷點,重新整理介面。
看下t.data
,key
,iv
和mode
的值。
t.data
就是資料包的回顯資料。
key=n=u.enc.Utf8.parse(l)
,l
是在上面定義的常量。
mode
透過mode: u.mode.ECB
可得到是ECB模式。
iv
就不需要了。 -
編寫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"))
執行結果如下
- 也可以透過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)
執行結果如下