JavaScript反混淆插件二:MemberExpression和ObjectProperty key值Literal化
【摘要】
前言 &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)