Files
reverse-skills-max/vendor-new/xbsReverseSkill/web-js-env-patcher/references/crypto-entry-location.md

4.7 KiB
Raw Blame History

加密入口定位模型

本文件用于补环境前置阶段:先找到加密参数从“数据源”到“写入请求”的完整链路,再决定是否进入 Node.js 补环境。

四层链路模型

定位结果必须尽量拆成四层,不要只记录一个疑似函数名。

层级 含义 常见证据 输出要求
source 数据源 参与签名的输入材料 URL、Query、Body、Cookie、localStorage、时间、随机数、指纹 列出字段和值来源
entry 加密入口 直接返回 sign/token 或中间签名的函数 调用栈、搜索参数名、断点命中、sourcemap 函数名、模块号、文件、行列号
builder 请求构造 把入口结果拼到请求对象的位置 axios/fetch 封装、SDK request 方法、拦截器 参数位置与写入前后的对象快照
writer 请求写入 最终写入网络请求的位置 fetch、XMLHttpRequest.send、setRequestHeader、URLSearchParams、cookie 最终 API、方法、Header/Query/Body/Cookie

只有记录到 writer,才能确认“找到的函数”确实影响目标请求。只有记录到 source,才能解释为什么 Node.js 输出和浏览器样本可能不一致。

三类常见架构

  1. 直接写入型:业务代码直接调用入口函数,然后把结果拼接到 Query/Header/Body。
  2. 拦截器型:axios/fetch/XHR 封装中统一补签名;业务调用栈上看不到参数名,需要看拦截器或 request wrapper。
  3. SDK 型:第三方或站点 SDK 初始化后接管请求,入口函数可能藏在 runtime chunk、动态 chunk、WASM 或 Worker 中。

推荐定位顺序

  1. 从成功请求样本确认 API,并先列出 Query / Header / Body / Cookie 中所有可疑加密参数;让用户确认本次要分析哪些参数。
  2. 在 DevTools Network 查看 Initiator,先记录请求发起文件和调用栈。
  3. 对 fetch、XMLHttpRequest.open/send/setRequestHeader 设置断点或 Hook,捕获 writer。
  4. 搜索参数名、Header 名、API path、接口封装方法名,寻找 builder。
  5. 沿调用栈向上找返回值来源,确认 entry。
  6. 回溯入口入参和读取的环境,整理 source。
  7. 若源码压缩严重,结合 sourcemap、webpack module id、动态 chunk 名、运行时模块缓存定位。
  8. 若存在 Worker、WASM、iframe 或 postMessage,读取 wasm-worker-postmessage.md 后单独建链。

断点与 Hook 组合

优先使用 Hook 快速缩小范围,再用断点确认源码位置:

  • fetch:看 URL、init、Header、Body。
  • XMLHttpRequest.open/send/setRequestHeader:看请求方法、URL、Header、Body。
  • URLSearchParams.append/set:看 Query 参数写入。
  • FormData.append:看表单 Body 参数写入。
  • document.cookie setter:看 Cookie 写入。
  • localStorage/sessionStorage.getItem:看 source 是否来自存储。
  • Date.now、performance.now、Math.random、crypto.getRandomValues:看时间随机依赖。
  • Function、eval、setTimeout(string):看动态代码和混淆解包。

Hook 模板见 hook-templates.md。Hook 只用于授权调试和证据收集,不修改请求、不批量访问。

入口定位记录模板

## 加密入口定位记录

### 目标请求
- API:
- 方法:
- 参数:
- 参数位置:

### writer 最终写入
- 类型:fetch / XHR / URLSearchParams / Header / Cookie / Body
- 文件与行列号:
- 调用栈:
- 写入前对象快照:
- 写入后对象快照:

### builder 请求构造
- 函数 / 方法:
- 所在模块:
- 输入:
- 输出:
- 是否经过拦截器:

### entry 加密入口
- 函数名 / 表达式:
- 文件 / chunk / module id:
- 行列号:
- 入参:
- 返回:
- 是否需要初始化:

### source 数据源
- URL / Query:
- Body:
- Cookie:
- localStorage / sessionStorage:
- 时间 / 随机数:
- navigator / screen / document / canvas / WebGL:
- 其他:

### 可信度
- 证据来源:Network / Hook / 断点 / sourcemap / 静态搜索 / 推断
- 是否可进入补环境:是 / 否
- 阻塞点:

进入补环境的最低条件

  • 已列出所有可疑加密参数,并已由用户确认本次要分析的目标参数。
  • 已确认目标参数在成功请求中存在。
  • 已确认 writer,知道参数最终写入哪里。
  • 已定位至少一个可调用或可追踪的 entry。
  • 已收集入口所在 JS 文件及依赖 chunk。
  • 已整理 source 初表,哪怕部分字段未知也要明确标记。
  • 已有至少一组浏览器真实 fixtures;动态参数建议至少三组。