# 字符串表与最小求值 这份文档用于处理字符串表、解码包装、局部别名链和最小引导 `eval`。 ## 适用场景 - 文件开头几条语句就在初始化解码器。 - 顶层 IIFE 里传入数组、对象或字符串表。 - 源码里大量出现 `fn(12)`、`arr[123]`、`String.fromCharCode(...)`。 - 第一层去壳之后,函数内部还存在二次字符串恢复。 ## 推荐顺序 1. 先定位数组字面量、解码函数和别名链。 2. 尽量优先做静态恢复,例如数组下标、纯字面量拼接、纯数字参数调用。 3. 只有静态无法推进时,才执行最小引导代码。 4. 删除已经消费掉的引导声明或包装层。 5. 重新 parse 一次,再进入控制流还原阶段。 ## 最小引导 `eval` 原则 - 只执行前几条足以构造解码器的代码。 - 不要直接执行整份源文件。 - 不要在未隔离的环境里执行明显依赖 DOM、`window`、定时器或网络的逻辑。 - 求值目标应尽量窄,例如“只恢复数字参数到字符串的函数调用”。 ## 常见模式 ### 顶层 IIFE 带数组参数 - 从顶层调用提取 `formalParam -> actualArg` 映射。 - 只替换明确命中的数组下标访问。 - 处理包装函数里直接可展开的语句块。 ### 前几条语句就是解密引导 - 只截取前 2 到 5 条关键语句。 - 建立最小运行时后,恢复只带字面量参数的调用点。 - 删除已消费的引导语句。 ### 去掉第一层后,局部函数还有二次恢复 - 先展开顶层 IIFE。 - 重新 parse。 - 再识别函数内部那组“构造器 + 成员表达式 + 数字下标”的模式。 ## 停止条件 - 主要字符串表已经恢复。 - 核心解码器入口已经清楚。 - 剩余部分不再适合纯静态恢复。 满足以上条件后,应切换到控制流或结构标准化阶段。