AST-抽象语法树

js加密解混淆首先想到的是AST语法树,那么什么是AST呢,学习AST过程的一些笔记

1.AST是JS执行的第一步是读取 js 文件中的字符流,然后通过词法分析生成令牌流Tokens,之后再通过语法分析生成 AST(Abstract Syntax Tree),最后生成机器码执行,其实就是生生成了一个大的JSON 对象,JSON对象应该好理解

2.AST 语法树来做很多事情,比如代码优化、静态分析、代码生成等

我们来用node 去试一下做一个简单的ast测试


一.使用espriam解释器

npm install fs
npm install esprima
npm install estraverse
npm install escodegen
npm install iconv-lite

下面说明一下这些库的含义

1. Esprima是一个用于解析和分析JavaScript代码的开源库。它将JavaScript代码解析为抽象语法树(Abstract Syntax Tree,AST),并提供了一组API来访问和操作该AST。

2.Estraverse是一个用于遍历和转换JavaScript抽象语法树(AST)的开源库。它是Esprima的一个插件,提供了一组API来遍历和操作Esprima生成的AST。

3.Escodegen是一个用于将JavaScript抽象语法树(AST)转换回JavaScript代码的开源库。它可以将经过修改的AST重新生成为可执行的JavaScript代码。

4.iconv-lite是一个用于字符编码转换的Node.js库。它提供了一种简单的方式来在不同的字符编码之间进行转换,包括常见的编码如UTF-8、UTF-16、ISO-8859-1等

5.fs 是node常用的文件处理的库

当我们使用Esprima库将JavaScript代码解析为AST时,AST的每个节点表示代码的不同部分。下面是给定AST的每个节点的解释:

  1. Program(程序):表示整个JavaScript程序。它是AST的根节点。

    • type: 'Program'
    • body: 一个包含程序主体的数组。在这个例子中,它包含了两个节点。
    • sourceType: 表示程序的类型,可以是'script'(脚本)或'module'(模块)。
  2. VariableDeclaration(变量声明):表示变量声明语句。

    • type: 'VariableDeclaration'
    • declarations: 一个包含变量声明的数组。在这个例子中,它包含一个变量声明
    • kind: 表示变量声明的类型,可以是'var'、'let'或'const'。
  3. FunctionDeclaration(函数声明):表示函数声明语句。

    • type: 'FunctionDeclaration'
    • id: 函数的标识符(名称)。
    • params: 一个包含函数参数的数组。在这个例子中,它为空数组,表示函数没有参数。
    • body: 函数的主体,表示函数的代码块
    • generator: 表示函数是否是一个生成器函数。
    • expression: 表示函数是否是一个表达式函数
    • async: 表示函数是否是一个异步函数。

loc节点:

AST(抽象语法树)中,每个节点都可以包含一个名为"loc"的属性,用于表示该节点在源代码中的位置信息。"loc"属性是一个包含"start"和"end"属性的对象,这两个属性分别表示节点在源代码中的起始位置结束位置

"start"属性是一个包含"line"和"column"属性的对象,用于表示节点在源代码中的起始行号和列号。例如,"start.line"表示节点在源代码中的起始行号,"start.column"表示节点在源代码中的起始列号。

"end"属性也是一个包含"line"和"column"属性的对象,用于表示节点在源代码中的结束行号和列号。例如,"end.line"表示节点在源代码中的结束行号,"end.column"表示节点在源代码中的结束列号。

通过使用"loc"属性,我们可以确定每个节点在源代码中的具体位置,这在进行代码分析、错误定位和代码重构等任务时非常有用。

 刚才我们的代码图里面是没有loc节点的,这不利于我们做逆向分析代码、代码还原,其实需要带上一个参数才能把它展示出来,我们把loc:ture 给带上,就可以了。


二. 用Babel解析器 做一下ast解析 对比,因为Esprima是一个轻量级别的解释器,Babel是一个功能强大的JavaScript编译器,它可以将新版本的JavaScript代码转换为向后兼容的版本

可以看到babel 有很多新节点

  1. sourceType: 'module': 这个选项指定了代码的源类型,可以是"script""module"

  2. plugins: ['jsx']: 这个选项指定了要启用的插件。在这里,我们启用了名为"jsx"的插件,它允许解析和处理JSX语法。

  3. tokens: true: 这个选项指定是否生成代码的标记(tokens)。标记是代码中的词法单元,如标识符、运算符、括号等。将其设置为true会生成一个标记数组,可以用于进一步分析代码的词法结构。

  4. comments: true: 这个选项指定是否生成代码的注释。将其设置为true会生成一个注释数组,可以用于提取和分析代码中的注释信息

  5. errorRecovery: true: 这个选项指定是否启用错误恢复机制。将其设置为true会在解析代码时尽可能地恢复错误,以便生成部分AST。这对于处理包含错误的代码很有用。

这里有两个有用的节点,一个是comments 一个是errorRecovery 用来做分析和还原,对于理解源代码是十分有用的

AST 说明就到这里,后面写混淆代码还原的时候会用到

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13214.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读取摄像机的内参和畸变系数并对畸变图像进行去畸变

这个程序的目标是读取摄像机的参数(内参和畸变系数),并对畸变图像进行去畸变操作,然后进行一些特征点和矩形框的绘制。 #include 语句引入所需的库。using namespace std; 和 using namespace cv; 语句是在代码中使用std和opencv命名空间,这样就不用在每次使用这些库的函数…

ChatGPT 有什么新奇的使用方式?

先来看看ChatGPT对此问题如何作答 ChatGPT对此问题如何作答 ChatGPT是什么 ChatGPT是一种基于自然语言处理的语言模型,由OpenAI开发。它是建立在GPT(Generative Pre-trained Transformer)架构的基础上的,采用了深度学习技术。GP…

Todo-List案例版本一

初级使用e.target.value 记得安装npm i nanoid与UUID类似 快捷键ctrlH替换内容 src/components/MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认&quo…

浅谈RPC协议

RPC协议 RPC简介为啥需要RPCRPC的调用过程gRPCProtoBuffergRPC实战 RPC简介 RPC&#xff08;Remote Procedure Call Protocol&#xff09;远程过程调用协议&#xff0c;目标就是让远程服务调用更加简单、透明。RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#x…

《动手学深度学习》——线性神经网络

参考资料&#xff1a; 《动手学深度学习》 3.1 线性回归 3.1.1 线性回归的基本元素 样本&#xff1a; n n n 表示样本数&#xff0c; x ( i ) [ x 1 ( i ) , x 2 ( i ) , ⋯ , x d ( i ) ] x^{(i)}[x^{(i)}_1,x^{(i)}_2,\cdots,x^{(i)}_d] x(i)[x1(i)​,x2(i)​,⋯,xd(i)​…

特征选择算法 | Matlab实现基于ReliefF特征选择算法的分类数据特征选择 ReliefF

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab实现基于ReliefF特征选择算法的分类数据特征选择 ReliefF 部分源码 %--------------------

写一个starter(spring boot)

前置知识 自动装配 自动装配的一个重要注解就是SpringBootApplication。它是一个复合注解&#xff0c;由四个元注解和另外三个注解组成。这三个注解是&#xff1a; ConfigurationEnableAutoConfigurationComponentScan Configuration Configuration 是 JavaConfig 形式的…

神经网络之VGG

目录 1.VGG的简单介绍 1.2结构图 3.参考代码 VGGNet-16 架构&#xff1a;完整指南 |卡格尔 (kaggle.com) 1.VGG的简单介绍 经典卷积神经网络的基本组成部分是下面的这个序列&#xff1a; 带填充以保持分辨率的卷积层&#xff1b; 非线性激活函数&#xff0c;如ReLU&a…

web安全php基础_php变量命名及其作用域

php变量命名规则 php变量命名规则 变量以 $ 符号开始&#xff0c;后面跟着变量的名称变量名必须以字母或者下划线字符开始变量名只能包含字母数字字符以及下划线&#xff08;A-z、0-9 和 _ &#xff09;变量名不能包含空格变量名是区分大小写的&#xff08;$y 和 $Y 是两个不…

SELECT * 会导致查询效率低的原因

SELECT * 会导致查询效率低的原因 前言一、适合SELECT * 的使用场景二、SELECT * 会导致查询效率低的原因2.1、数据库引擎的查询流程2.2、SELECT * 的实际执行过程2.3、使用 SELECT * 查询语句带来的不良影响 三、优化查询效率的方法四、总结 前言 因为 SELECT * 查询语句会查…

【如何成功加载 HuggingFace 数据集】不使用Colab,以ChnSentiCorp数据集为例

【如何成功加载 HuggingFace 数据集】不使用Colab&#xff0c;以ChnSentiCorp数据集为例 前置加载数据集尝试一&#xff1a;标准加载数据库代码尝试二&#xff1a;科学上网尝试三&#xff1a;把 Huggingface 的数据库下载到本地尝试3.5 创建 state.json彩蛋 前置 Huggingface …

MySQL用户管理

目录 用户管理 用户 用户信息 创建用户 删除用户 修改用户密码 数据库的权限 给用户授权 回收权限 用户管理 如果我们只能使用root用户&#xff0c;这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理。 用户 用户信息 MySQL中的用户&#xff0c;都存储…