MINIMAX稀宇科技 爬虫AI-API复用-海螺前端JS代码的动态调试
海螺前端JS代码的动态调试
环境准备
chrome浏览器, burpsuit,
实际操作
主要操作在chrome浏览器中进行:
第零步: 通过burpsuit抓包, 在重放中改变request header参数, 定位关键参数
第一步: 进入需要自动化发包的页面, 在js代码中寻找关键参数.
第三步: 对关键参数的js文件进行分析, 找到围绕关键参数的代码上下文.
第四步: 打断点, 反复动态调试, 调整恰当step in 深度.
第五步: 找到全部的关键参数的关键上下文
过程详情
关键参数列表:
"Token"
"Yy"
unix_v
characte_id
chat_id
“/v4/api/chat/msg”
其中Token是服务器下发的, Yy推测是客户端生成的, unix_v, character_id, chat_id是动态测试过程中发现的针对Yy的自变量.
因为Yy关键词较难定位(与日期处理的yy杂糅在一起, 造成严重干扰). 又考虑到Token与Yy都是关键变量, 因此推测两者在一起出现. 但是还是很难搜索到, 这两个关键词太普通了. 通过前期安卓逆向的经验, 得知“/v4/api/chat/msg”关键词联袂出席. 具有明显特征. 将其确定为search_token=“/v4/api/chat/msg”
搜索得到636-f83c0591c5b62750.js , 在该文件中再找token和yy. 一开始看到这个文件也是很绝望的, 有5k多行, 看到头大.
找到token和yy同时出现的行有三处:
但是js代码实在是丑陋, 我无法肉眼完成数据流分析, 只能借助大模型的力量(有无针对js文件的数据流分析工具?).
大模型完成了一次不算完全正确的数据流分析: 大模型输出
avigator) && void 0 !== t && t.deviceMemor
作为关键词, 检索. 文件中检索出来的函数返回值让我觉得十分可疑. 于是我开始动态调试.
动态调试:
将断点打在yy处和可疑代码 return (null == e ? void 0 : e.includes("?")) ? "".concat(e, "&").concat(n) : "".concat(e, "?").concat(n) 处
经过多次单步调试发现最相关的代码块, 用于生成yy值的原始字符串逻辑
于是我跟踪定位t, u, i三个变量. 得到结论t是与host拼接前的url后缀, u是一个叫做yyBody的变量, i是unix时间戳.
于是事情变得明朗了起来. 我只需要知道yyBody的变量生成方式就可以了. 同时我检查了t中的unix值和i是否一致, 答案如我心意保持一致.
定位yyBody变量. 我不能知道yyBody是在哪里执行的, 所以所有搜索到的yyBody赋值行都被打上断点
这样我就获得了yyBody赋值的过程. 深入其中, 我通过参数值的一致性发现了这段代码是yyBody的赋值过程. 确定了关键词: U、 characte_id、 chat_id. 其中后两者的值都能从请求体中得到, 但是U的值无法得到, 并且动态调试中U始终是undefined. 因此默认为“”.
确定了所有因变量的值后, 我深入分析了fingerprint的生成逻辑. 大模型告诉我这是个md5码生成器.
综上所述, 获得了全部的要求解的参数和求解参数需要用到的函数. 需要注意的是, 有两处有自定义的关键词去除 msgContent = re.sub(r'(\r\n|\n|\r)', '', msgContent)和官方定义的encodeURIComponent.
结论
通过前端的JS代码的动态调试, 成功实现了自动化的chat.