局内标识符重命名
-
回看控制流,可以发现他们都是由执行函数包裹的,这类基本上都有一个特点,就是防止变量污染,这也是我们接下来的重头戏
-
既然有防止变量污染,就肯定会有和全局变量的标识符相重合的,如果直接还原,就会报错,该标识符不能使用 var 定义,所以我们就需要进行处理,修改局内标识符的名字,全局的不变
-
这时候就用上了我们前面收集的变量名
-
重命名思路
-
遍历所有的方法,排除掉最外层的匿名函数以及赋值的方法
-
获取当前匿名函数下的控制流的控制流数字的标识符,if 判断的标识符
-
遍历 VariableDeclarator 进行判断修改
-
-
代码实现
-
-
这是获取控制流标识符,不细说,上面有写
-
修改标识符
-
首先,获取当前标识符的绑定
-
然后,获取绑定下的两个属性 constantViolations, referencePaths
-
constantViolations 里面存储了对标识符的值进行修改了的语句(赋值),是一个数组
-
referencePaths里面存储了对标识符进行了引用的语句(方法调用),是一个数组
-
-
修改条件
-
当前标识符不等于控制流相关标识符
-
等于控制流相关标识符之一,如果有初始化值(没有代表不是一个地方),则判断初始化的值是否和控制流初始化的相同,不同就代表不是一个地方,不是一个地方就代表了需要进行修改,因为作用域不同,但标识符相同,会造成污染
-
-
满足修改条件后
-
是否不存在收集的变量名当中,不存在代表唯一,不需要修改
-
生成一个新的唯一的标识符
-
然后在引用了的语句进行进行修改标识符名称
-
-
最后重命名完成
至此,227实战还原系列完成,
这里特别鸣谢 52破解的sergiojune大佬,以及悦来客栈老板二人对本文的帮助,有对ast感兴趣的可以联系老板加星球学习ast
以上
有需要成品ast 或者 补环境代码的可以联系本人
let v = Died_in2021