AST实战|如何使用babel库彻底还原jsfuck混淆代码

关注它,不迷路。       

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

1. 需求分析

我们在还原jsfuck代码时,代码量少的可以使用 常量折叠 插件来还原,但是对于大部分jsfuck代码来说,调用traverse 函数 时 直接报错:

d473f22c0dffcd18b95fc499738a24f0.png

尝试过看源代码解决该问题,但能力有限,跟下去后就不了了之了。因此,我们需要想个办法,来跳过这种报错,让它可以正常处理。

2. 思路详解

把jsfuck代码拿到 AST在线解析网站 进行解析,发现可以正常解析。

这时候,我想的是,它的 Transform 功能可以正常使用嘛?

浏览器环境:谷歌浏览器, 版本 114.0.5735.134(正式版本) (64 位)

ea2137537f3d6b54b4b60b3214da46a0.png

1.点击 Transform 按钮,并选择 babelV7.

2.把jsfuck代码贴入到左边的第一个编辑器,然后把 常量折叠的插件 贴入到 左边的第二个编辑器,当然,需要按照它的方式进行修改:

export default function (babel) {
  const { types: t } = babel;
  
  return {
    name: "ast-transform", // not required
    visitor: {
        "BinaryExpression|UnaryExpression"(path) {
        if(path.isUnaryExpression({operator:"-"}) || 
         path.isUnaryExpression({operator:"void"}))
      {
        return;
      }
        const {confident, value} = path.evaluate();
        if (!confident)
            return;
        if (typeof value == 'number' && (!Number.isFinite(value))) {
            return;
        }
        path.replaceWith(t.valueToNode(value));
    }
    }
  };
}

这个时候,右边下面的编辑框还是报错:

b30e0aca081df42f213c43cc0c8f2d67.png

没关系,我们 在

path.replaceWith(t.valueToNode(value));

下面加一行代码试试:

path.skip();

当我输入 path.s  后,右边的代码突然就正常了。

29190b187db2fe3ace651cec3657fb4c.png

屡试不爽,我也不知道为啥。这个时候,我们拿右边的结果再进行反混淆,就不会报错啦。

最终还原后的jsfuck代码:

443a7660453c73da21448ec9de09b963.png

3. 代码源码:

所有的代码都在这里:

https://t.zsxq.com/10Pnlb59Q

已购买星球的的兄弟可以参考本文自行尝试。

今天的文章就分享到这里,后续分享更多的技巧,敬请期待。

1b671d0079c9b2246c32e5567b44a173.jpeg

欢迎加入知识星球,学习更多AST和爬虫技巧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Babel 插件通常是使用 `babel.transformFromAst` 方法将 AST 转换为代码。该方法接收两个参数:AST 和选项对象。 AST(抽象语法树)是由 Babel 解析 JavaScript 代码时生成的一个对象,它表示代码的结构。 选项对象是可选的,用于指定转换过程的一些选项,比如源代码的文件路径和目标语言的版本。 使用方法如下: ``` const { transformFromAst } = require('babel'); const code = `const x = 1;`; const ast = parse(code); // parse 函数用于将代码解析为 AST const options = {}; const { code: transformedCode } = transformFromAst(ast, options); ``` 在这个例子中,变量 `transformedCode` 将包含转换后的代码字符串。 ### 回答2: Babel插件可以通过对AST进行遍历和修改来生成将加工完成的AST翻译成代码。 首先,Babel解析器负责将代码文件转换成AST(Abstract Syntax Tree)。AST代码的抽象表示形式,它以树状结构表示代码的逻辑结构和语法信息。 接下来,Babel插件通过对AST进行遍历来访问和分析节点。遍历可以使用Babel提供的访问者模式来实现。在遍历过程中,插件可以选择性地对AST节点进行修改,例如添加、删除或替换节点。 插件在遍历AST期间可以使用Babel提供的访问者方法来操作节点。例如,可以使用`enter`方法在进入某个节点时触发相应的回调函数,或者使用`exit`方法在离开节点时触发回调函数。这样,插件就能够在特定节点上执行自定义的操作。 最后,当所有的AST节点遍历和修改都完成后,Babel插件可以使用Babel提供的代码生成器将最终的AST转换回代码代码生成器会根据AST的结构和规则生成相应的代码字符串。 总结而言,Babel插件通过遍历AST并对节点进行修改,最终将加工完成的AST转换回代码。这样可以实现对源代码的转译、转换或优化等操作,提供了一种灵活且可扩展的方式来处理JavaScript代码。 ### 回答3: Babel 是一个非常强大的 JavaScript 编译器工具,它可以将最新版本的 JavaScript 代码转换为向后兼容的代码,使得我们可以在老旧的浏览器或环境中运行新的 JavaScript 语法或特性。 Babel 的核心功能是生成抽象语法树 (AST),将源代码解析成一个包含了语法结构的对象。然后,它针对这个 AST 进行扩展、修改和转换工作,最后将经过修改后的 AST 生成新的代码。 插件是 Babel 中实现这些转换工作的关键。当 Babel 解析源代码后,它会顺序地应用一系列插件来修改 AST。每个插件都对应一个或一组转换规则,这些规则告诉 Babel 如何修改和遍历 AST。 当 Babel 遍历 AST 时,它会从顶层节点开始,递归地遍历所有节点。每当遇到一个节点时,Babel 会调用相应插件中的对应转换规则来对节点进行转换。这些规则可以通过修改当前节点,或者增加、删除、移动其他节点来实现。 在所有插件的转换规则应用完毕后,Babel 会将最终的 AST 重新生成为代码。这个过程称为代码生成。Babel 会从 AST 的根节点开始,生成与源代码对应的逐行代码。在此过程中,Babel 还会根据需要添加适当的缩进和换行符,以保持代码的可读性。 通过这种方式,Babel 插件可以将加工完成的 AST 翻译成代码。我们可以通过编写自定义的插件,来扩展 Babel 的功能,实现更多自定义的转换规则,从而将源代码转换成我们期望的形式。插件的生成代码过程是 Babel 实现 JavaScript 代码转换的核心机制之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值