3.1 KiB
3.1 KiB
调试、补环境与证据管理
一、优先级
优先采用:
- Hook / logpoint
- 调用栈回溯
- 条件断点
- 普通断点
原因:
- Hook 更适合持续采样
- Logpoint 更适合 JSVMP / 高频状态机
- 调用栈更适合区分 builder 和 wrapper
二、最值钱的 hook 点
请求链
fetchXMLHttpRequest.prototype.openXMLHttpRequest.prototype.sendsetRequestHeaderJSON.stringify
结果写出点
document.cookie- 目标对象字段写入
- 已知 builder 函数
运行时代码
evalFunctionDate.nowMath.randomcrypto.getRandomValues
三、最小补环境优先级
P0:先让代码进入 builder
windowselfglobalThisdocumentnavigatorlocation
P1:再对齐 builder 输入
document.cookielocalStoragesessionStorageperformanceDatecryptoscreenhistory
P2:最后才补拟真指纹层
canvaswebglaudiopluginsmimeTypesRTCPeerConnectionindexedDBIntl
默认只补到 P0 或 P1。
四、判断是不是环境问题
应先补环境的信号
- 入口直接报对象未定义
- 浏览器与本地中间态差异显著
collect、环境位串、指纹对象明显不一致
不应先补环境的信号
- 已经收缩成纯函数
- 真实问题是入口没找对
- 真实问题是 token、cookie、challenge、load 返回对象没喂进去
五、四层证据
1. source 检查点
记录:
- cookie
- storage
- UA
- 页面配置
- challenge 初值
2. builder 输入检查点
记录真正喂给 builder 的对象。
3. builder 中间态检查点
记录:
- 原始串
- 中间数组
- payload
- 编码前字节流
4. 最终输出检查点
记录:
- sign
- token
- collect
- verify payload
六、浏览器与本地对齐
每次做本地复现时都执行:
- builder 输入是否一致
- 原始串是否一致
- 中间数组 / payload 是否一致
- 最终编码前数据是否一致
- 最终结果是否一致
只比最终值通常不够。
七、AST 的边界
AST 最适合做:
- 字符串表还原
- 常量折叠
- 死代码删除
- 简单代理函数内联
- 局部控制流整理
AST 不适合代替:
- JSVMP 运行时取证
- 强环境依赖 builder
- 高频状态机调试
最稳的顺序是:
先定 writer
-> 再做局部 AST 降噪
-> 再做 hook / logpoint
八、反调试与拟真问题
高频问题:
debugger死循环- 时间差检测
toString检测- 原型链检测
- Proxy 暴露问题
优先原则:
- 先让观察成本下降。
- 先保留证据,再决定是否深拟真。
- 不要一上来把所有原型链和 native 外观都补掉。
九、常见误区
- 先补环境,再找入口
- 只追求不报错
- 只在最终值处打点
- 普通断点打太多,反而丢主线
- 没有留下任何可复用工件