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

                                      前言               

                         

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

String.fromCharCode

  

有些表达式却是这样的:

String["fromCharCode"]

  

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

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

插件功能

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

处理实例

处理前:


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

处理后:


   
  1. var a = b["length"];
  2. var foo = {
  3. "bar": function () {}
  4. };

插件来源

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

和 plugin-transform-property-literals,

略有修改,地址:


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

插件源码

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


   
  1. const types = require("@babel/types");
  2. const member_property_literals = {
  3. MemberExpression:
  4. {
  5. exit({node})
  6. {
  7. const prop = node.property;
  8. if (!node.computed && types.isIdentifier(prop))
  9. {
  10. node.property = types.StringLiteral(prop.name);
  11. node.computed = true;
  12. }
  13. }
  14. },
  15. ObjectProperty:
  16. {
  17. exit({node})
  18. {
  19. const key = node.key;
  20. if (!node.computed && types.isIdentifier(key))
  21. {
  22. node.key = types.StringLiteral(key.name);
  23. }
  24. }
  25. },
  26. }

插件原理

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

这里举个例子说明一下:

var a = b.length;

  

这段代码解析是这样的:

var a = b["length"];

  

解析是这样的:

差异如下:


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

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

注意事项

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

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

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

(完)