AST还原实战|万能数组还原插件:让工具帮你节约时间

举报
悦来客栈的老板 发表于 2022/05/04 23:56:56 2022/05/04
【摘要】 关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 昨天群友丢过来一个混淆的js,问我怎么还原,下面是部分代码: 通篇下来,都是这种数组调用,这种对我来说不要太简单,但是据他说,他是手动替换,足足需要花19个小时: 像这种大的数组,其元素全部...

关注它,不迷路。

  • 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!

昨天群友丢过来一个混淆的js,问我怎么还原,下面是部分代码:

0722c2f2cb42fbb0b1ec5efe437cb3e2.png

通篇下来,都是这种数组调用,这种对我来说不要太简单,但是据他说,他是手动替换,足足需要花19个小时:

8d700f4c37ea1a6766a64b44b2248cf8.png

像这种大的数组,其元素全部被替换了,不用ast,如果写正则也很简单,不过我还是选择了最简单粗暴的方式。

首先把 上面 kJ 的定义及其相关的代码复制到控制台,看看是否能直接得到结果:

897712540c350755c590c0ba344c9d15.png

直接就拿到了kJ数组,环境都不用补。再就是如何将类似 kJ[0] 给替换成 

"exports",拿到在线解析网站,可以发现它是 MemberExpression 类型,并且满足子节点:

object 是Identifier 类型并且 property 是 NumericLiteral 类型。

因此可以很快就写出插件:


   
  1. const replaceArrayElements =
  2. {
  3. MemberExpression:{
  4. exit(path)
  5. {
  6. let {object,property} = path.node;
  7. if (!types.isIdentifier(object,{name:"kJ"}) ||
  8. !types.isNumericLiteral(property))
  9. {
  10. return;
  11. }
  12. let value = kJ[property.value];
  13. path.replaceWith(types.valueToNode(value));
  14. }
  15. },
  16. }

然后在这个插件上面添加 kJ 声明与定义相关的代码,让它在ast能够正常运行即可。

还原后的效果图:

ae62aae77d99bab4b34197899c368d86.png

就这么几行代码,也不费多少时间。

那如果要写出通用的插件怎么写?如果数组只是简单的变量定义,如:

var a = [1,2,3];
  

则可以使用scope来进行还原,如果不是,则需要自己把数组的声明和定义复制到ast文件中,然后调用插件即可。

我这里给出一个写好的插件,供读者研究,如果你有更好的办法,请私聊我,感谢。


   
  1. //这里填入 数组的声明与定义  ①
  2. let arrName = "XXX";   //XXX 为你要还原的数组名  ②
  3. const replaceArrayElements =
  4. {
  5. MemberExpression:{
  6. exit(path)
  7. {
  8. let {object,property} = path.node;
  9. if (!types.isIdentifier(object,{name:arrName}) ||
  10. !types.isNumericLiteral(property))
  11. {
  12. return;
  13. }
  14. let value = eval(path.toString());
  15. path.replaceWith(types.valueToNode(value));
  16. }
  17. },
  18. }

插件说明:

  • ①需要插入数组的声明与定义,能正常运行。

  • ②XXX替换为数组名即可。

好了,本文就写到这里,如果想进群交流AST相关技术,可添加本人微信:

6a49d377758a73355a049203772a1cb6.png

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/124564738

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。