AST还原实战|万能数组还原插件:让工具帮你节约时间
关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
昨天群友丢过来一个混淆的js,问我怎么还原,下面是部分代码:
通篇下来,都是这种数组调用,这种对我来说不要太简单,但是据他说,他是手动替换,足足需要花19个小时:
像这种大的数组,其元素全部被替换了,不用ast,如果写正则也很简单,不过我还是选择了最简单粗暴的方式。
首先把 上面 kJ 的定义及其相关的代码复制到控制台,看看是否能直接得到结果:
直接就拿到了kJ数组,环境都不用补。再就是如何将类似 kJ[0] 给替换成
"exports",拿到在线解析网站,可以发现它是 MemberExpression 类型,并且满足子节点:
object 是Identifier 类型并且 property 是 NumericLiteral 类型。
因此可以很快就写出插件:
-
const replaceArrayElements =
-
{
-
MemberExpression:{
-
exit(path)
-
{
-
let {object,property} = path.node;
-
if (!types.isIdentifier(object,{name:"kJ"}) ||
-
!types.isNumericLiteral(property))
-
{
-
return;
-
}
-
-
let value = kJ[property.value];
-
path.replaceWith(types.valueToNode(value));
-
}
-
},
-
}
然后在这个插件上面添加 kJ 声明与定义相关的代码,让它在ast能够正常运行即可。
还原后的效果图:
就这么几行代码,也不费多少时间。
那如果要写出通用的插件怎么写?如果数组只是简单的变量定义,如:
var a = [1,2,3];
则可以使用scope来进行还原,如果不是,则需要自己把数组的声明和定义复制到ast文件中,然后调用插件即可。
我这里给出一个写好的插件,供读者研究,如果你有更好的办法,请私聊我,感谢。
-
//这里填入 数组的声明与定义 ①
-
let arrName = "XXX"; //XXX 为你要还原的数组名 ②
-
const replaceArrayElements =
-
{
-
MemberExpression:{
-
exit(path)
-
{
-
let {object,property} = path.node;
-
if (!types.isIdentifier(object,{name:arrName}) ||
-
!types.isNumericLiteral(property))
-
{
-
return;
-
}
-
-
let value = eval(path.toString());
-
path.replaceWith(types.valueToNode(value));
-
}
-
},
-
}
插件说明:
①需要插入数组的声明与定义,能正常运行。
②XXX替换为数组名即可。
好了,本文就写到这里,如果想进群交流AST相关技术,可添加本人微信:
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/124564738
- 点赞
- 收藏
- 关注作者
评论(0)