js逆向实战之数位观察响应数据解密
1.爬虫基础内容回顾2.js逆向基础知识3.python执行JavaScript代码出现编码问题的解决方案4.初识JavaScript逆向——以网易云音乐和招标网站为例5.JavaScript逆向之md5算法6.JavaScript逆向之AES和DES加解密7.JavaScript逆向之RSA算法8.JavaScript逆向之手撸ob混淆9.JavaScript逆向之有道翻译加解密全过程解析10.JavaScript逆向之iwencai请求头参数加密过程解析11.JavaScript逆向之七麦数据实战12.JavaScript逆向之代码补环境(以iwencai为例)13.js逆向实战之微信公众平台pwd参数解密14.js逆向实战之一品威客signature参数解密15.js逆向实战之莫莫铺子sign参数解密16.js逆向实战之智通财经网token参数解密17.js逆向实战之喜马拉雅Xm-Sign参数解密18.js逆向实战之中国男子篮球职业联赛官方网站返回数据解密19.js逆向实战之企名片返回数据解密20.js逆向实战之weibotop.cn返回数据解密21.js逆向实战之集思录登录参数加密解析
22.js逆向实战之数位观察响应数据解密
23.js逆向实战之某证信Accept-Enckey参数加密解析24.js逆向实战之Bitcoin浏览器交易x-apikey参数加密逻辑25.js逆向实战之烯牛数据请求参数加密和返回数据解密26.js逆向实战之酷我音乐请求参数reqId加密逻辑27.js逆向实战之某市场监管公告服务平台返回数据解密28.js逆向实战之某乐网登录参数pwd加密29.js逆向实战之某天下登陆参数pwd加密逻辑30.js逆向实战之某网游登录参数password加密31.js逆向实战之某古加响应数解密逻辑32.js逆向实战之某数据平台响应数解密逻辑33.js逆向实战之某二手平台请求参数加密逻辑34.js逆向实战之某预约票网站请求参数加密35.js逆向实战之某监管平台请求参数加密36.js逆向实战之某某查响应数据解密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)
运行结果如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通