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.cbaleague.com/data/#/teamMain?teamId=29124
分析过程
-
看流量包,返回数据全是加密的字符串,要做的就是解密回显数据。
-
由于这里的网址都比较特殊,里面都带有id号,所以通过url关键字去搜索不是一个很好的办法。
-
看initiators,里面有很多异步传输。
-
异步传输中,如果想对数据进行加解密,有一个比较常用的方法,拦截器(interceptors),此处我们可以通过搜索
interceptors
来定位。
-
总共有5处,一处一处判断。
- 第一处只是new了两个对象,肯定不是。
- 第二处,第三处中,
unshift
和push
函数是js中对字符串进行插入字符的函数,肯定也不是加密过程。
- 第四处是响应拦截器,第五处是请求拦截器,请求拦截器大概率是加密逻辑,响应拦截器大概率是解密逻辑,且不是js中的原生代码,要找的地方基本上没跑了。
-
由于是对响应数据进行解密,所以在响应拦截器中打断点,进行调试。
看看e
的值。
e.data
就是响应的加密数据,所以bx
函数就不需要看了,直接看$6e
函数。 -
定位函数。
-
在这段代码中可以看到关键词
AES
,不用想肯定是AES算法了。想要AES解密的话,需要知道key
,mode
,如果mode
是CBC
还需要知道iv
,如果mode
是ECB
就不需要知道iv
。打断点,看下key
,mode
,iv
是什么。
mode
为AES.ECB
,就不需要iv
了。
r
就是key
,r = tp.enc.Utf8.parse(t)
就是将t
进行utf8编码后赋值给r
。
-
AES算法的三要素都知道了,就可以编写python代码进行解密了。(这里还需要当心回显数据是经过base64编码的,所以在解密之前需要先进行base64解码)
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad, pad
import requests
import base64
url = "https://data-server.cbaleague.com/api/teams/29124/seasons/2023/players"
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"})
mi_str = base64.b64decode(resp.text)
key = "uVayqL4ONKjFbVzQ".encode("utf-8")
aes_encrypt = AES.new(key=key, mode=AES.MODE_ECB)
plaintext = aes_encrypt.decrypt(mi_str)
plaintext = unpad(plaintext, 16)
print(plaintext.decode("utf-8"))
运行结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通