227还原实战(七)终章

局内标识符重命名

  • 回看控制流,可以发现他们都是由执行函数包裹的,这类基本上都有一个特点,就是防止变量污染,这也是我们接下来的重头戏

  • 既然有防止变量污染,就肯定会有和全局变量的标识符相重合的,如果直接还原,就会报错,该标识符不能使用 var 定义,所以我们就需要进行处理,修改局内标识符的名字,全局的不变

  • 这时候就用上了我们前面收集的变量名

  • 重命名思路

    1. 遍历所有的方法,排除掉最外层的匿名函数以及赋值的方法

    2. 获取当前匿名函数下的控制流的控制流数字的标识符,if 判断的标识符

    3. 遍历 VariableDeclarator 进行判断修改

  • 代码实现

  • 这是获取控制流标识符,不细说,上面有写

  • 修改标识符

  • 首先,获取当前标识符的绑定

  • 然后,获取绑定下的两个属性 constantViolations, referencePaths

    • constantViolations 里面存储了对标识符的值进行修改了的语句(赋值),是一个数组

    • referencePaths里面存储了对标识符进行了引用的语句(方法调用),是一个数组

  • 修改条件

    1. 当前标识符不等于控制流相关标识符

    2. 等于控制流相关标识符之一,如果有初始化值(没有代表不是一个地方),则判断初始化的值是否和控制流初始化的相同,不同就代表不是一个地方,不是一个地方就代表了需要进行修改,因为作用域不同,但标识符相同,会造成污染

  • 满足修改条件后

    • 是否不存在收集的变量名当中,不存在代表唯一,不需要修改

    • 生成一个新的唯一的标识符

    • 然后在引用了的语句进行进行修改标识符名称

  • 最后重命名完成

至此,227实战还原系列完成,

 这里特别鸣谢 52破解的sergiojune大佬,以及悦来客栈老板二人对本文的帮助,有对ast感兴趣的可以联系老板加星球学习ast

以上

有需要成品ast 或者 补环境代码的可以联系本人

let v =  Died_in2021

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值