关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 需求分析
在反混淆的两大类中,代码结构的调整也是非常的至关重要。现在的混淆代码喜欢把逗号表达式藏匿于各种语句中,干扰调试,非常的烦人,如:
所以,可以写个插件来将其提取出来,进行还原处理。
2. 思路详解
由于逗号表达式会隐藏在各种语句代码中,而其父节点有些是表达式,有些是语句,因此需要区分开来,方便代码处理。
例如 IfStatement,ReturnStatement等语句,获取其父节点,可以直接往父节点的前面插,而诸如 ConditionalExpression,AssignmentExpression等表达式,需要往祖先节点的前面插,两者插入的方式不一样,所以可以写两个方法分别处理。
方法一,处理 Statement:
function SequenceOfStatement(path)
{
//some code;
}
方法二,处理Expression:
function SequenceOfExpression(path)
{
//some code;
}
3. 同时遍历
写个插件,对上面的两个方法进行同时遍历:
const resolveSequence =
{
SequenceExpression:
{//对同一节点遍历多个方法
enter:[SequenceOfStatement,SequenceOfExpression]
}
}
traverse(ast, resolveSequence);
注意:enter 后面 的 方法名,遍历时是有先后顺序的。不过在这里影响不大。
完整的逗号表达式处理插件在这里:
https://t.zsxq.com/0bX5uLaia
今天的文章就分享到这里,后续分享更多的技巧,敬请期待。
欢迎加入知识星球,学习更多AST和爬虫技巧。