js逆向实战之数位观察响应数据解密

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

posted @   死不悔改奇男子  阅读(438)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示