⚠️ 免责声明:本文仅供技术交流与学习使用,请勿将相关技术用于非法用途或侵犯他人权益。
仅供学习使用,如有侵权,联系删除文章
目标接口:
aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL2VidXMvZnV3dS9hcGkvbnRobC9hcGkvQ29tbVF1ZXJ5L3F1ZXJ5Rml4ZWRIb3NwaXRhbA==目标参数:x-tif-nonce、x-tif-signature、encData、signData,响应结果
通过xhr hook发现参数已经生成
跟踪堆栈,在 Promise.then 处单步进入下一个回调,发现是混淆代码(需进行ast反混淆),或者直接搜索encData
最终进入负责组装请求头的请求拦截器,并定位到 x-tif-signature 的生成位置。
| 参数 | 来源/算法 | 说明 |
x-tif-timestamp | _0x701636 | 时间戳 |
x-tif-nonce | Object(_0x366b24.a)() | 随机字符串 |
x-tif-signature | sha256(timestamp+nonce+ timestamp) |
signData分析
接着在下面定位signData和encData生成的位置
这里if恒为false,只需要关注else分支下的代码
进入_0x5e3f52函数,主要是 对明文data进行&拼接后,在尾部拼接key,key在之前就定义过了
最后使用 SM2 签名,并将结果转换成base64,生成signData
encData分析
需要在每个case上打上断点分析,最终在此case上进行的加密
解密encData
发现响应也是加密的
此处使用hook脚本进行定位解密位置
(() => { const originalParse = JSON.parse; JSON.parse = function (...args) { const result = Reflect.apply(originalParse, this, args); const field = result?.data?.data; if (typeof field?.encData !== "string") return result; console.log("[响应已解析]", result); let value = field.encData; Object.defineProperty(field, "encData", { configurable: true, enumerable: true, get() { console.log("[读取 encData]", value.slice(0, 32)); debugger; return value; }, set(next) { value = next; } }); return result; }; window.undoResponseHook = () => { JSON.parse = originalParse; }; console.log("响应 Hook 已安装"); })();定位解密位置
运行成功案例:
出于安全考虑,本章省略大部分调试内容,不提供完整流程,仅保留核心思路,细节请自行调试还原,相信你也可以!