JavaScript反混淆插件二:MemberExpression和ObjectProperty key值Literal化

举报
悦来客栈的老板 发表于 2020/12/29 00:18:00 2020/12/29
【摘要】                                       前言              &n...

                                      前言               

                         

有时候拿到一份混淆的源代码时,同一个方法的调用,有些表达式是这样的:

String.fromCharCode

  

有些表达式却是这样的:

String["fromCharCode"]

  

这样在处理的时候,就要判断节点的类型,否则可能漏处理相关的表达式。因此,需要一个插件将这种形式统一化,处理起来方便。

正好,babel库官方的有个这样的插件来进行统一。

插件功能

规范MemberExpression类型的property节点和ObjectProperty类型的key节点,使其统一化,全部转变为StringLiteral节点,方便处理。

处理实例

处理前:


       var a = b.length;
       var foo = {
         bar: function () {},
       }
   
  

处理后:


       var a = b["length"];
       var foo = {
        "bar": function () {}
       };
   
  

插件来源

官方插件 plugin-transform-member-expression-literals 

和 plugin-transform-property-literals,

略有修改,地址:


       https://babeljs.io/docs/en/babel-plugin-transform-member-expression-literals
       https://babeljs.io/docs/en/babel-plugin-transform-property-literals
   
  

插件源码

下面的源码参考了官方的插件,略有修改,进行了合并。


       const types = require("@babel/types");
       const member_property_literals = {
         MemberExpression:
         {
       exit({node})
        {
       const prop = node.property;
       if (!node.computed && types.isIdentifier(prop))
        {
        node.property = types.StringLiteral(prop.name);
        node.computed = true;
        }
        }
         },
         ObjectProperty:
         {
       exit({node})
        {
       const key = node.key;
       if (!node.computed && types.isIdentifier(key))
        {
        node.key = types.StringLiteral(key.name);
        }
        }
         },
       }
   
  

插件原理

通过在线解析网站进行类型的对比,把有差异的地方更改即可。

这里举个例子说明一下:

var a = b.length;

  

这段代码解析是这样的:

var a = b["length"];

  

解析是这样的:

差异如下:


       1.computed的值不一样
       2.property节点的类型不一样。
   
  

可以很明显的看出需要处理的地方一目了然,先判断特征,再写代码就很容易了。

注意事项

此插件会导致我们在调用path.evaluate方法遍历MemberExpression节点时失效。不过我们可以更改源代码让其成功。修改的方法也很简单,加几行代码即可。

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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