关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 需求分析
如题,如何将a["length"] 与 a.length 的相互转换? 有时候统一格式后,更方便我们处理。当然,我的风格是将所有的 类似 a.length 全部 转换为 a["length"] ,因为我获取到它是个字面量,更放心吧。
2. 混淆代码
还原前:
var a = b.length;
还原后:
var a = b["length"];
或者
还原前:
var a = b["length"];
还原后:
var a = b.length;
3. 思路
因为知道还原前后的代码,将上面的代码复制到 在线解析网站观察相关特征即可。
4. 插件源码
/**********************************************
var a = b.length;
==>
var a = b["length"];
**********************************************/
const keyToLiteral = {
MemberExpression:
{
exit({node})
{
const prop = node.property;
if (!node.computed && types.isIdentifier(prop))
{//只是 node.computed的区别
node.property = types.StringLiteral(prop.name);
node.computed = true;
}
}
},
ObjectProperty:
{
exit({node})
{
const key = node.key;
if (!node.computed && types.isIdentifier(key))
{//只是 node.computed的区别
node.key = types.StringLiteral(key.name);
}
}
},
}
以及:
/**********************************************
var a = b["length"];
==>
var a = b.length;
**********************************************/
const keyToIdentifier = {
MemberExpression:
{
exit({node})
{
const prop = node.property;
if (node.computed && types.isStringLiteral(prop))
{
node.property = types.Identifier(prop.value);
node.computed = false;
}
}
},
}
插件参考:
https://www.babeljs.cn/docs/babel-plugin-transform-member-expression-literals
今天的文章就分享到这里,后续分享更多的技巧,敬请期待。
欢迎加入知识星球,学习更多AST和爬虫技巧。