前言
有时候拿到一份混淆的源代码时,同一个方法的调用,有些表达式是这样的:
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