AST反混淆实战篇七|常量折叠

举报
悦来客栈的老板 发表于 2021/09/07 22:27:30 2021/09/07
【摘要】 初看标题,你可能不知道 常量折叠 是什么意思,其实很简单,我把它理解为一个多元表达式合并为一个常量表达式,例如: var a = 1 + 2 + 3 + 4; 等式右边是一个计算表达式,这样的表达式是可以直接计算出来的,可以替换成: var&n...

初看标题,你可能不知道 常量折叠 是什么意思,其实很简单,我把它理解为一个多元表达式合并为一个常量表达式,例如:

var a = 1 + 2 + 3 + 4;

  

等式右边是一个计算表达式,这样的表达式是可以直接计算出来的,可以替换成:

var a = 10;

  

又如,经常可以看到混淆的js代码中包含如下表达式:


   
  1. while(!![])
  2. {
  3. ......
  4. }

其实就是一个条件恒为真的循环:


   
  1. while(true)
  2. {
  3. ......
  4. }

对于这样的常量计算,如果针对每个表达式都写个插件,那是不是太辛苦了?

不用担心,强大的babel库帮我们搞好了,只需要调用它的相关方法即可。

一.插件名称

常量折叠。

二.还原实例

还原前:


   
  1. var a = !![],b = 'Hello ' + 'world' + '!',c = 2 + 3 * 50,d = Math.abs(-200) % 19,e = true ? 123:456;

还原后:

var a = true,b = "Hello world!",c = 152,d = 10,e = 123;

  

三.是否通用

是。

四.还原思路

  1. 可用于常量折叠的表达式基本上有下面这些,根据需求,可以同时遍历不同的表达式。

    BinaryExpression、UnaryExpression、ConditionalExpression、CallExpression、MemberExpression、SequenceExpression
    
        
  2. 调用babel库的 evaluate 方法,注意判断返回值是否合理;

  3. 注意某些表达式的遍历会导致堆栈溢出,需要进行过滤;

五.插件源代码

星友们可以访问这里获取插件源代码:

https://t.zsxq.com/YvvVrjE

  

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/120148240

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。