ast_tools 源码解读

# IfWithExpressFix

image-20220311193502748

主要是给不包含 block 的 if 表达式添加上,让其统一化。

if(a=1) var b=3;
-----------------
if(a=1){var b=3}

# ForWithExpressFix & ForWithForFix

image-20220311193754270

都是给 For 循环规范化。

# ReturnSeqFix

将 return 中包含逗号表达式的还原

image-20220311194547853

第一部分用于将所有的逗号表达式添加到数组中,第二步主要是将逗号表达式前 n-1 项加到 return 前面,然后将 return 节点只包含逗号表达式的最后一项。

function add(a,b){return c=a+1,b}
--------------------------
function add(a,b){c=a+1;return ab}

# VariableDeclaratorFix

声明表达式及赋值表达式还原。

var a,b,c;
m=2,d=3,n=4;
-----------
var a;
var b;
var c;
m=2;
d=3;
n=4;

# ConditionalFix

三目表达式转化为 if-else 的形式。

image-20220311200057628

# SequenceExpressionFix

image-20220311200313589

本质上还是逗号表达式的还原。

# AssignmentWithConditionalFix

image-20220311200459670

还是对三目表达的还原,这里限制了其 consequent 和 alternate 部分都为数字。

# LogicalExpressionFix

image-20220311200832831

将逻辑表达式转化为条件表达式。

# UnaryFunctionFix

image-20220311201334471

把自执行函数的壳去掉。

# ControlFlowFix

控制流平坦化。

  • 进入大 FOR 循环,获取第一个初始化 Ci 的表达式,然后根据一个三目获取变量的名称 (其余的条件貌似不是针对大控制流的)。

  • 定义了两个数组,分别用于存取大控制流的变量

image-20220311203909800

  • 生成了一个函数,给定一个初始的 li 然后会返回一个字典包含这五个参数。

  • 进入控制流,然后生产了一个用于判断是否结束的函数。

  • 获取主流程 switch 节点

  • 初始化了 get_control_struct 函数,steps_hash_list,bodys,get_next_control_param 函数,

  • 定义了一个 get_node 函数 (控制流的另一种形式,初始 li 参数)

控制流的另一种形式:将上述控制流转化为一个类似字典的东西,键指代控制流指向,值包含其内容为 node 类型。

# get_code 函数

控制流的整体流程

image-20220311210310953

这里获取所有初始参数的值

image-20220311210631798

这一步应该是不断计算,获取最下层节点即 Ai 节点的值。

image-20220311211105814

在这里,由于包含 IF 的模块,所以还要对其进行一个判断,get_next_control_param 用于获取其类型是否包含这种 IF。

向栈中添加这两个节点值。

image-20220311211853434

然后根据这个 11490 在进行一个这个流程,在进入 while 流程中,基本上就将控制流还原了。

ba = window;
Nt = r;
ur = void 0;
Jo = void 0;
ei = O;
if (Nt) {
。。。。
} else {
。。。
}

整体思想,获取初始参数的值,计算出中间参数的值,找到最底层的节点,获取当前节点的表达式,然后获取下一步初始参数的值 (要对 for 循环中的条件进行一个判断),反复调用并合并节点,最后将整个大 FOR 循环脱掉。

# ConstantFix

image-20220311220445933

字符串的还原。

# DecryptVariableFix

将 w.pop () 的形式,还原为字符串。

# ReserveStrFix

image-20220311215701659

这玩意的还原。

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

Mr2 WeChat Pay

WeChat Pay