js define 如何debug_对基于滑块点选的混淆JS的还原小感悟之去除控制流(一)

话不多说,直接干货,此次是想介绍一种纯基于js的方式来去除一种较为容易的控制流。先上代码:

50f587799fc89e2ab7bad546dbd37c98.png

可以看到函数体内部利用for语句和switch语句增加了阅读难度,而debug的时候更是恶心,所以我们迫切需要剥掉冗余的外壳,去伪存真。

抽象语法树,简称AST,将JS代码抽象成树状结构,然后通过对树的“修剪”,最终实现简化代码的作用。

之前用estraverse和esprima做过一些,但是浅尝辄止。最近认真看了蔡老板的星球,所以又再度重拾AST的使用,确实轻松许多。

babel,号称The compiler for next generation JavaScript,真不是白给的,确实好用,至于具体的安装过程...此文忽略...自行百度。

在安装好之后,一般需要调用下面几个工具:

fb03c72856a759c56f507246233f8d33.png

“parse”是用来将js代码抽象为语法树;

“generator”将语法树还原为js代码

“traverse”用来遍历语法树,从而进行修改,是最为核心的工具。

“types”主要是在修剪AST的过程中判断各种语法的类型

理论说完,直接代码:

72072635465f97c54f872b837d3a8efa.png

将函数变为文本赋给str_code

27c047465ebe632123c1b41e2f402b0f.png

利用parse将文本转化为语法树ast

接下来也是最核心的地方,设置遍历时的修剪条件

752d68c5840ea78fb6f8bd5ac230d912.png

visitor是对AST的所有操作逻辑和流程,简单言说就是当遇到“FunctionDeclaration”类型的节点时候,通过各种条件的设置,来筛选出你想要修改的特定函数体,比如需要满足在函数体内部有for循环模块,有switch模块,switch中cases的数量等等条件,当全部满足的时候,就我们要做手术的函数体,之后再通过各种设置,最终将节点按照自己的所想的方式实现出来。

4d9d55ff276b8118c6c861d0d3079705.png

traverse是按照既定的逻辑流程来遍历修剪语法树对象ast。

f639bc6cbeb46adf39d924a9533eb386.png

generator将修剪后的ast还原成js代码。

具体效果如何,我们打印代码:

4f8ed09412886621b87e840cc2e6fa1e.png

可以看到,清除了控制流,逻辑清爽直观了许多,里面还有很多可以修剪的地方,但不是此次的重点,有兴趣的可以自己尝试一下。

如果你能理解这个简单的控制流,那么在熟练使用之后,当遇到难度加大的,我相信只要耐下心来就可以一点点实现。

今天介绍的是一种极为优雅、清爽且专业的js实现方式,那么有没有python可以实现的呢?答案是必须的,甚至我觉得在用python实现之后,成就感甚至更高那么一点点,下次再做介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值