Files

1.9 KiB

字符串表与最小求值

这份文档用于处理字符串表、解码包装、局部别名链和最小引导 eval。

适用场景

  • 文件开头几条语句就在初始化解码器。
  • 顶层 IIFE 里传入数组、对象或字符串表。
  • 源码里大量出现 fn(12)、arr[123]、String.fromCharCode(...)。
  • 第一层去壳之后,函数内部还存在二次字符串恢复。

推荐顺序

  1. 先定位数组字面量、解码函数和别名链。
  2. 尽量优先做静态恢复,例如数组下标、纯字面量拼接、纯数字参数调用。
  3. 只有静态无法推进时,才执行最小引导代码。
  4. 删除已经消费掉的引导声明或包装层。
  5. 重新 parse 一次,再进入控制流还原阶段。

最小引导 eval 原则

  • 只执行前几条足以构造解码器的代码。
  • 不要直接执行整份源文件。
  • 不要在未隔离的环境里执行明显依赖 DOM、window、定时器或网络的逻辑。
  • 求值目标应尽量窄,例如“只恢复数字参数到字符串的函数调用”。

常见模式

顶层 IIFE 带数组参数

  • 从顶层调用提取 formalParam -> actualArg 映射。
  • 只替换明确命中的数组下标访问。
  • 处理包装函数里直接可展开的语句块。

前几条语句就是解密引导

  • 只截取前 2 到 5 条关键语句。
  • 建立最小运行时后,恢复只带字面量参数的调用点。
  • 删除已消费的引导语句。

去掉第一层后,局部函数还有二次恢复

  • 先展开顶层 IIFE。
  • 重新 parse。
  • 再识别函数内部那组“构造器 + 成员表达式 + 数字下标”的模式。

停止条件

  • 主要字符串表已经恢复。
  • 核心解码器入口已经清楚。
  • 剩余部分不再适合纯静态恢复。

满足以上条件后,应切换到控制流或结构标准化阶段。