AST-抽象语法树

news2024/9/24 19:20:02

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.coloradmin.cn/o/731940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D 旋转木马

在工作中我们常用到3D装换和3D位移 主要知识点 3D位移:transale3d(x,y,z)3D旋转:rotate3d(x,y,z)透视:perspective3D呈现 transfrom-style 1、 transale3d translform: translform:translateX(100px):仅仅是在x轴上移动translform:transl…

[NOI2014] 随机数生成器(模拟+贪心)

题面 [NOI2014] 随机数生成器 - 洛谷 题解 缝合题 第一部分,直接模拟题目操作生成二维数组即可,复杂度O(n*mQ) 第二部分,是一个比较经典的字典序贪心 首先肯定需要将最小的数放到路径上,这样可选的剩下的数就被限制在了最小数…

Redis 管道

问题由来:如何优化频繁命令往返造成的性能瓶颈? Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。 一个请求会遵循以下步骤: 1、客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果),并监听S…

Codeforces Round 883 (Div. 3) A~G

比赛链接:Dashboard - Codeforces Round 883 (Div. 3) - Codeforces 目录 A. Rudolph and Cut the Rope B. Rudolph and Tic-Tac-Toe C. Rudolf and the Another Competition D. Rudolph and Christmas Tree E. Rudolf and Snowflakes F. Rudolph and Mimic…

JavaWeb项目(包含SSM项目)部署到Linux云服务器

目录 一、云服务器环境部署 1、安装JDK 查看JDK的命令为: 安装JDK命令: 2、安装Tomcat 2.1 安装步骤 2.2 验证Tomcat是否启动成功 3、安装MySQL 二、部署 Web 项目到 Linux 2.1 在云服务器中数据库建库建表 2.2 修改部署项目连接数据库密码 …

Qt(Day2)

实现登录框中,当登录成功时,关闭登录界面,并跳转到其他界面:

Go实现在线词典翻译(三种翻译接口,结合sync)

火山翻译 首先介绍用火山翻译英译汉。 package mainimport ("bufio""bytes""encoding/json""fmt""io""log""net/http""os""strings""unicode" )type DictRequestHS st…

第四章:角色和菜单管理功能【基于Servlet+JSP的图书管理系统】

角色和菜单功能 一、角色功能 接下来我们可以完成角色管理的增删改查操作 1. Bean对象 创建sys_role对应的实体对象SysRole Data public class SysRole {private Integer id;private String name;private String notes;private Date createTime; }2. Dao层 现在我们就可以在D…

JVM(Java虚拟机)详解

目录 一、JVM内存区域划分 1. 什么是内存区域划分以及为啥要进行区域划分 2. JVM内存区域划分详解 3. 堆区详解: 4. 给一段代码,问某个变量是在那个区域上? 二、JVM类加载机制 1.类加载的过程 2. 类加载的时机 3. 双亲委派模型&#xff08…

下班前几分钟,我彻底玩懂了tmux

目录 1. tmux简介2. Session3. Window4. Pane5. 自定义tmux配置6. 在shell脚本中操纵tmuxReferences 1. tmux简介 tmux(terminal multiplexer)是一个非常强大的工具,主要有以下几点功能: 终端复用: tmux 使你能够在一…

Linux分布式应用 Zabbix监控配置[添加主机 自定义监控内容 邮件报警 自动发现/注册 代理服务器 高可用集群]

-------------------- 添加 zabbix 客户端主机 -------------------- 关闭防火墙 systemctl disable --now firewalld setenforce 0 hostnamectl set-hostname zbx-agent01 服务端和客户端都配置时间同步 yum install -y ntpdate ntpdate -u ntp.aliyun.com 服务端和客户端都设…

基于simulink跟踪火车站对象检测遗弃物体(附源码)

一、前言 此示例演示如何跟踪火车站的对象并确定哪些对象保持静止。公共场所的遗弃物品会引起当局的关注,因为它们可能会构成安全风险。算法(例如本例中使用的算法)可用于通过将他们的注意力引导到潜在的感兴趣区域来协助监控实时监控视频的…

二十五、传输层协议(上)

文章目录 一、再谈端口号(一)端口号定义(二)端口号范围划分1.一共有 2^16 个端口2.认识知名端口号(Well-Know Port Number)3.端口号和进程就是K-V关系4.netstat(1)示例1: n 拒绝显示别名&#x…

CentOS Linux上安装JDK11、MySQL8.0、Minio等软件(rpm脚本模式)

本地环境:Windows 10家庭版 16G内存 512G硬盘 软件:VMWare WorkStation 16.0 FinalShell 4.0.1 一、下载必要软件包 下载软件均选择x86架构64位!!!(可根据自己的电脑配置选择) CentOS Linu…

基础算法-前缀和

1 算法笔记 2.代码示例 3.代码解析 #include<iostream> using namespace std; const int maxn 1010000; int a[maxn],s[maxn];//a数组是用来存放数组的&#xff0c;s是用来存放前n项数组的和 int m,n;int main(){scanf("%d%d",&n,&m);for(int i1;i&l…

【react】插件react-tsparticles和tsparticles实现粒子特效:

文章目录 一、效果图:二、实现思路:三、实现代码:【1】安装依赖【2】 一、效果图: 二、实现思路: particles&#xff08;npm i react-particles-js&#xff09;目前已被弃用&#xff1b;取代它的是tsparticles&#xff08;npm i react-tsparticles 和npm install tsparticles&a…

docker 安装应用

前文介绍&#xff1a;我们再阿里云领取的ECS服务器&#xff0c;服务器选择应用模板&#xff0c;他会自动帮我们的服务器安装docker的一些相关插件。如果没有&#xff0c;则需要自己安装docker docker 安装Jenkins 1.下载Jenkins镜像 推荐版本 jenkins/jenkins:lts 命令&…

python 实现简易的学员管理系统

文章目录 前言基本思路需求实现1.实现菜单的功能2.提示用户输入需要进行的操作&#xff0c;并执行相关操作3.具体函数功能的实现增加学员信息显示所有学员信息删除学员信息修改学员信息查询学员信息 整体代码展示 前言 前面我们已经学习了 python 的输入输出、条件语句、循环、…

面向对象编程主线三

面向对象编程 三、第三阶段 高内聚&#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b; 低耦合&#xff1a;仅对外暴露少量的方法用于使用。 封装性的设计思想&#xff1a;把该隐藏的隐藏起来&#xff0c;该暴露的暴露出来。 3.1、面向对象的特…