JavaScript 逆向之 AST 还原

目录

JavaScript 逆向之 AST 还原

一、什么是 AST?

二、为什么需要 AST 还原?

三、AST 还原的原理

四、AST 还原的工具

五、AST 还原的实际应用

六、AST 还原的挑战和注意事项


在 JavaScript 逆向工程中,AST(抽象语法树)还原是一种强大的技术,可以帮助我们理解和分析经过混淆或压缩的代码。本文将深入探讨 JavaScript 逆向中的 AST 还原技术,包括其原理、工具和实际应用。

“抽象语法树” 这个名称的由来可以从以下几个方面理解:

抽象” 的含义

  1. 简化和概括:抽象语法树是对源代码的一种抽象表示。它并不包含源代码的所有细节,而是提取出其中的关键语法结构,忽略了一些与语法结构无关的细节,如注释、空白字符等。这种简化和概括的过程使得我们可以更专注于代码的逻辑结构,而不是被具体的文本形式所束缚。
  2. 高层次表示:它提供了一个比源代码更高层次的表示形式。源代码是具体的文本,而抽象语法树则是将这些文本转化为一种结构化的数据结构,使得我们可以更方便地进行分析和处理。这种高层次的表示方式使得我们可以从更宏观的角度理解代码的结构和行为。

“语法” 的含义

  1. 关注语言结构:抽象语法树主要关注的是编程语言的语法结构。它将源代码按照编程语言的语法规则进行解析和组织,形成一个树状结构,其中每个节点代表一个语法元素,如函数声明、变量赋值、条件语句等。通过这种方式,抽象语法树可以清晰地展示代码的语法结构,帮助我们理解代码的逻辑。
  2. 符合语言规范:抽象语法树的构建是基于编程语言的语法规范的。不同的编程语言有不同的语法规则,抽象语法树的结构也会因语言而异。但是,无论哪种编程语言,抽象语法树都是按照其语法规范进行构建的,确保了对代码的准确表示。

三、“树” 的含义

  1. 层次结构:抽象语法树采用树状结构来表示代码。树是一种层次结构,其中每个节点都有一个父节点和零个或多个子节点。这种层次结构非常适合表示代码的嵌套结构,如函数内部可以包含多个语句,语句又可以包含表达式等。通过树状结构,我们可以清晰地看到代码的层次关系,便于进行分析和处理。
  2. 易于遍历和操作:树状结构使得抽象语法树易于遍历和操作。我们可以通过遍历树的节点来访问代码的各个部分,进行分析、修改或生成新的代码。同时,树状结构也提供了一种方便的方式来进行代码的重构和优化,如提取函数、重命名变量等。

综上所述,“抽象语法树” 这个名称准确地描述了这种数据结构的特点和作用。它是对源代码的一种抽象、语法关注的树状表示,为代码分析、编译、优化等任务提供了有力的工具。

一、什么是 AST?

AST 是源代码的抽象语法结构的树状表示。它由节点组成,每个节点代表源代码中的一个特定结构,如函数声明、变量赋值、条件语句等。AST 提供了一种结构化的方式来表示代码,使得我们可以更方便地分析和操作代码。

例如,以下 JavaScript 代码的 AST 可能如下所示:

function add(a, b) {
  return a + b;
}

对应的 AST 结构可能为:

  • FunctionDeclaration(函数声明)节点,包含函数名add和参数列表[a, b]
  • BlockStatement(块语句)节点,包含函数体。
  • ReturnStatement(返回语句)节点,包含表达式a + b

二、为什么需要 AST 还原?

在实际的 JavaScript 开发中,为了减小代码体积、提高加载速度或保护知识产权,开发者可能会使用混淆或压缩工具对代码进行处理。这些工具会改变代码的结构和语法,使得代码难以阅读和理解。

例如,经过混淆的代码可能如下所示:

var _0x1234 = function(_0x5678, _0x9abc) {
  return _0x5678 + _0x9abc;
};

这种代码不仅变量名变得难以理解,而且函数的结构也被改变。在这种情况下,AST 还原可以帮助我们恢复代码的可读性,理解代码的逻辑。

以上我有个问题 就是这些16进制是怎么生成的

在 JavaScript 中,变量名使用类似 “_0x1234” 这样的形式通常是经过混淆处理后的结果。这种混淆方式可能通过以下几种方式将变量名转换为看似十六进制的形式:

随机生成

混淆工具可能随机生成一些字符串,这些字符串可能看起来像十六进制数只是一种巧合。例如,通过随机算法生成一系列字符组合,其中可能包含数字和字母,而这些组合恰好类似十六进制的表示形式。

特定规则转换

  1. 基于某种算法对原始变量名进行转换。比如对原始变量名进行哈希运算,然后将哈希值转换为十六进制表示。这样可以使变量名难以被轻易识别和理解。
  2. 可能根据一定的编码规则进行转换。例如,将原始变量名的每个字符进行特定的编码操作,最终得到类似十六进制的结果。

举例说明

假设原始函数名为 “add”,混淆工具可能进行如下操作:

  1. 对 “add” 进行某种哈希运算,得到一个数值,比如 4660。
  2. 将 4660 转换为十六进制表示 “0x1234”,作为新的变量名。

这种混淆方式的目的主要是增加代码的可读性难度,保护代码的知识产权或防止被轻易分析和修改。

三、AST 还原的原理

AST 还原的基本原理是通过分析混淆或压缩后的代码,构建其 AST,然后对 AST 进行分析和修改,以恢复代码的可读性。这个过程通常包括以下步骤:

  1. 构建 AST:使用 AST 解析工具(如 Esprima、Acorn 等)对混淆或压缩后的代码进行解析,构建其 AST。
  2. 分析 AST:遍历 AST,分析每个节点的类型和属性,了解代码的结构和逻辑。
  3. 修改 AST:根据分析的结果,对 AST 进行修改,例如重命名变量、还原函数结构、删除无用代码等。
  4. 生成代码:使用 AST 生成工具(如 Esprima、Babel 等)将修改后的 AST 转换回 JavaScript 代码。

四、AST 还原的工具

  1. AST 解析工具

    • Esprima:一个流行的 JavaScript 解析器,可以将 JavaScript 代码解析为 AST。
    • Acorn:另一个轻量级的 JavaScript 解析器,也可以生成 AST。
  2. AST 分析和修改工具

    • AST Explorer:一个在线工具,可以可视化 JavaScript 代码的 AST,并进行分析和修改。
    • Babel:一个 JavaScript 编译器,可以将 ES6 + 代码转换为 ES5 代码,同时也可以对 AST 进行分析和修改。
  3. AST 生成工具

    • EsprimaAcorn不仅可以解析代码生成 AST,还可以将 AST 转换回 JavaScript 代码。
    • Babel也可以将修改后的 AST 转换回 JavaScript 代码。

五、AST 还原的实际应用

  1. 代码分析和理解:通过 AST 还原,可以恢复混淆或压缩后的代码的可读性,帮助我们更好地理解代码的逻辑和结构。这对于分析第三方库、研究安全漏洞等都非常有帮助。
  2. 代码优化和重构:在对代码进行优化和重构时,可以使用 AST 还原技术来分析代码的结构,找出潜在的问题和改进点。例如,可以通过重命名变量、提取函数等方式来提高代码的可读性和可维护性。
  3. 安全审计:在进行安全审计时,AST 还原可以帮助我们分析恶意代码的结构和行为,找出潜在的安全漏洞。例如,可以通过分析混淆后的 JavaScript 恶意软件,找出其攻击向量和漏洞利用点。

六、AST 还原的挑战和注意事项

  1. 复杂性:AST 还原是一个复杂的过程,需要对 JavaScript 语言和 AST 的结构有深入的了解。同时,不同的混淆和压缩工具可能会使用不同的技术来改变代码的结构,这增加了 AST 还原的难度。
  2. 法律和道德问题:在进行 AST 还原时,需要注意法律和道德问题。未经授权的逆向工程可能会违反法律和道德规范,因此在进行 AST 还原时,应该确保是在合法的目的下进行,例如安全研究、漏洞修复等。
  3. 准确性:AST 还原可能无法完全恢复代码的原始结构和语义。在进行 AST 还原时,需要谨慎分析和验证还原后的代码,确保其准确性和可靠性。

总之,AST 还原是一种强大的 JavaScript 逆向技术,可以帮助我们理解和分析经过混淆或压缩的代码。通过使用合适的工具和技术,我们可以有效地进行 AST 还原,提高代码的可读性和可维护性。但同时,我们也需要注意法律和道德问题,确保在合法的范围内进行逆向工程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值