爬虫逆向-AST科技

news/2025/10/2 20:18:50/文章来源:https://www.cnblogs.com/wzzkaifa/p/19123957

学习目标:

  1. 了解 ast 执行过程
  2. 了解 ast 语法转换方式
  3. 熟悉如何转换代码
  4. 熟悉使用babel执行命令

0.前言

在编程语言的生态中,根据代码执行前是否需要完整编译,主要分为编译型语言解释型语言两大阵营,二者在执行效率与灵活性上呈现出鲜明差异,而 JavaScript 作为典型的解释型语言,其执行性能的突破很大程度上依赖于 V8 引擎的架构设计。

(一)、先明确:编译型与解释型语言的核心差异

要理解 V8 引擎的设计逻辑,首先需要厘清两类语言的本质区别 —— 核心差异集中在 “代码转换为机器码的时机”,这直接决定了执行速度与使用场景的不同。

类型核心特点执行流程典型代表优劣势
编译型语言代码运行前完成 “一次性编译”,生成与操作系统架构匹配的机器码源码 → 编译器 → 机器码(预生成)→ 直接执行机器码C、C++、Go优势:执行速度快(无需运行时翻译);劣势:跨平台性弱(不同系统需重新编译)、开发调试周期长
解释型语言无预编译过程,代码运行时 “逐行 / 逐段翻译” 为机器码,边翻译边执行源码 → 解释器 → 实时转换机器码 → 执行JavaScript、Python、Ruby优势:跨平台性强(依赖解释器适配)、开发灵活;劣势:传统架构下执行速度慢(重复翻译开销)

传统解释型语言的性能瓶颈,本质是 “无状态执行”—— 每次运行代码都要重新解析源码、构建语法树,无法复用历史执行信息;而 V8 引擎的核心创新,正是通过 “解释器 + 编译器” 的混合架构,弥补了这一短板。

(二)、V8 引擎的四大核心执行阶段

V8 作为 Chrome 与 Node.js 的底层 JavaScript 引擎,其执行流程可拆解为Parse(解析)、Ignition(解释执行)、TurboFan(编译优化)、Orinoco(垃圾回收) 四个阶段,前三者形成 “解释 - 编译” 的闭环,后者保障内存高效利用。

1. Parse 阶段:从源码到抽象语法树(AST)

此阶段的核心目标是 “将人类可读的 JS 源码,转换为引擎可理解的结构化数据”,分为 “词法分析” 与 “语法分析” 两步:

  • 词法分析(Tokenization):将源码按语法规则拆分为最小语义单元(Token),例如把 let a = 1 + 2; 拆分为 let(关键字)、a(标识符)、=(赋值运算符)、1(数值字面量)、+(算术运算符)、2(数值字面量)、;(语句结束符)。
  • 语法分析(Parsing):根据 JS 语法规则,将 Token 序列组装为抽象语法树(AST)——AST 是一种树形结构,直观反映代码的语法逻辑(如变量声明、表达式运算、函数调用的层级关系)。

举个例子:let sum = 1 + 2; 的 AST 会包含三个核心节点:

  • 顶层节点:变量声明(let
  • 左子节点:标识符(sum
  • 右子节点:加法表达式(1 + 2,包含两个数值子节点)

AST 是后续所有处理的 “基础原料”—— 它不仅用于解释执行,还会被 V8 的语法检查模块(如检测未声明变量、语法错误)使用,若语法有误,会在此阶段抛出错误(如 Uncaught SyntaxError)。

2. Ignition 阶段:从 AST 到字节码,实现 “快速启动 + 信息收集”

Ignition 是 V8 的解释器,其核心作用有两个:一是 “快速执行代码”,二是 “为编译优化收集数据”,流程分为两步:

  • AST 转换为字节码:字节码是一种 “介于 AST 与机器码之间的中间代码”,比机器码更简洁(体积小、跨架构),又比 AST 更接近执行逻辑。例如,将 AST 中的 “加法表达式” 转换为字节码指令 Add,“变量赋值” 转换为 StoreLocal
  • 解释执行字节码 + 收集 Profiling 信息:Ignition 会逐行执行字节码,同时实时收集 “热点信息”—— 比如某段代码被执行的次数(是否为 “热点代码”)、函数参数的类型(如 sum(1,2) 中参数均为数值)、条件判断的分支概率(如 if (x > 10) 中 true 分支的执行频率)。

这些 Profiling 信息是后续 TurboFan 优化编译的关键 —— 只有明确 “哪些代码高频执行、数据类型有何规律”,才能针对性生成高效机器码。

3. TurboFan 阶段:从字节码到优化机器码,突破性能瓶颈

TurboFan 是 V8 的优化编译器,它并非对所有代码编译,而是只针对 Ignition 标记的 “热点代码”(如频繁调用的函数、循环执行的代码块)进行优化,核心逻辑是 “基于 Profiling 信息,生成针对性的高效机器码”,常见优化手段包括:

  • 类型专化(Type Specialization):JS 是动态类型语言(变量类型可随时变化),但热点代码中变量类型往往稳定(如 sum 函数参数始终是数值)。TurboFan 会基于收集到的类型信息,生成 “专用于该类型” 的机器码(无需再判断类型),大幅减少执行开销。
  • 循环优化(Loop Optimization):对高频执行的循环(如 for (let i=0; i<10000; i++))进行优化,例如 “循环展开”(减少循环判断次数)、“常量折叠”(将循环内的常量计算提前到编译阶段,如 i * 2 若 i 是常量则直接计算结果)。
  • 内联优化(Inlining):对频繁调用的小函数(如 function add(a,b) { return a+b; }),将函数体直接 “嵌入” 调用位置,避免函数调用的栈开销(如参数入栈、返回地址保存)。

优化后的机器码会直接替换原有的字节码执行逻辑 —— 当热点代码再次执行时,会直接运行 TurboFan 生成的机器码,执行速度可接近编译型语言。

注意:若优化假设失效(如原本稳定的变量类型突然变化,如 sum 函数突然传入字符串),V8 会触发 “去优化(Deoptimization)”,暂时退回到 Ignition 解释执行,重新收集信息后再决定是否重新优化。

4. Orinoco 阶段:垃圾回收,保障内存高效利用

JS 代码执行过程中会不断创建对象(如 let obj = { name: 'V8' })、数组、函数等,这些对象会占用内存。Orinoco 是 V8 的垃圾回收器(GC),其核心目标是 “自动回收不再被使用的内存(垃圾对象),避免内存泄漏”。

Orinoco 采用 “分代回收” 策略,将内存分为 “新生代”(存活时间短的对象,如临时变量)和 “老生代”(存活时间长的对象,如全局变量、长期缓存对象),针对不同代际的对象采用不同回收算法:

  • 新生代回收:采用 “Scavenge 算法”,将内存分为两个空间(From 区、To 区),新对象先存入 From 区;当 From 区满时,将存活对象复制到 To 区,然后清空 From 区,交换两区角色,实现快速回收(回收效率高,适合短生命周期对象)。
  • 老生代回收:采用 “Mark-Sweep(标记 - 清除)” 与 “Mark-Compact(标记 - 整理)” 结合的算法 —— 先标记所有存活对象,再清除未标记的垃圾对象;若内存碎片过多,则将存活对象整理到内存一端,减少碎片,保障大对象的内存分配。

垃圾回收过程会暂停 JS 执行(“Stop-The-World”),但 Orinoco 通过 “增量标记”“并发标记” 等技术,将回收时间拆分到多个 JS 执行间隙,大幅降低对代码执行的影响。

(三)、核心总结:V8 为何能提升 JS 执行性能?

V8 引擎的本质是 “用 “解释器 + 编译器” 的混合架构,平衡 “启动速度” 与 “执行速度””:

  1. 快速启动:通过 Ignition 解释器,无需等待完整编译,AST 转换为字节码后即可执行,保障代码能快速响应(如页面初始化 JS)。
  2. 性能突破:通过 TurboFan 编译器,对热点代码生成优化机器码,弥补了解释型语言的性能短板。
  3. 内存安全:通过 Orinoco 垃圾回收器,自动管理内存,减少开发者手动处理内存的负担与泄漏风险。

正是这一架构设计,让 JavaScript 从 “慢执行” 的解释型语言,成长为可支撑大型应用(如前端框架、Node.js 后端服务)的高性能语言。

其中,生成 AST 、生成字节码、生成机器码是比较重要的三个阶段。

一、什么是AST技术

抽象语法树(Abstract Syntax Tree,简称 AST)是编译原理中的核心概念,它是源代码语法结构的一种抽象树状表示。树中的每个节点对应代码中的一种语法结构,这种形式类似于一个层次清晰、结构规范的复杂 JSON 对象。借助 AST,我们不再直接操作混杂空格与符号的原始代码文本,而是基于一棵严谨的树形结构,能够以编程方式高效、精准地分析和修改代码。

AST 技术应用广泛,包括但不限于:IDE 的语法高亮、代码检查、自动化格式化、代码压缩与转译等。大部分代码处理工具首先都会将源代码解析为 AST,再执行后续操作。例如,为处理 ES5 和 ES6 之间的语法差异并实现向后兼容,Babel 等转译工具就是基于 AST 进行语法转换的。虽然 AST 并非专为逆向工程设计,但掌握 AST 技术能够在 JavaScript 代码解混淆等逆向场景中显著提升效率。

通过AST解析网站:https://astexplorer.net/,左侧为我们要输入的JavaScript代码,右侧为AST树状结构

1.AST在编译中的位置(编译器转换过程)

在编译原理中,编译器转换代码通常要经过六个步骤(其中语法分析,语法分析,代码生成是我们重点关注的)

(1)词法分析

词法分析是编译过程的第一步,主要任务是将源代码拆解为一个个最小的、不可再分的词法单元,这些单元被称为 token

以代码 var a = 1; 为例,词法分析后会生成以下 token:vara=1;。值得注意的是,在 JavaScript 中,空格通常不被视为 token,解析时会被忽略。

我们可以类比自然语言的处理方式。例如,句子“2019年是祖国70周年”可被拆分为如下有意义的最小单元:“2019年”、“是”、“祖国”、“70”、“周年”。若进一步拆分如“0周”、“年”,则失去原有语义——代码分词同理,每个 token 都应具备独立的语法意义。

在 JavaScript 中,常见的词法单元包括:

  • 关键字:如 varletconstifelse 等;

  • 标识符:指变量名、函数名等未被引号括起来的连续字符;

  • 运算符:如 +-*/= 等;

  • 数字:支持十进制、十六进制、八进制及科学计数法表示;

  • 字符串:被单引号或双引号括起来的字符序列;

  • 空格:包括连续空格、换行符和缩进(通常不影响语法,仅作为分隔);

  • 注释:行注释(//)和块注释(/* */)均作为整体处理;

  • 其他符号:如大括号 {}、圆括号 ()、分号 ;、冒号 : 等。

(2)语法分析

语法分析是编译过程中的关键阶段,其主要任务是将词法分析产生的 token 流,转换成一个层次化、结构化的树形表示——即抽象语法树(AST)

该过程不仅检查代码是否符合语法规范,还会确定各个 token 之间的嵌套关系和组合方式,从而体现出程序的语法结构。可以类比为自然语言中组词成句的过程:词法分析提供了“词语”,而语法分析则根据语法规则,将这些词语组织成具有正确结构和明确意义的“句子”。

因此,语法分析实质上是对 token 进行语法层面的归类、结构化,并建立起能够反映代码逻辑的树形层次关系,为后续的语义分析、代码生成等阶段奠定基础。

// 举例
var a = 42;
var b = 5;
function addA(d){return a+d;
}
var c = addA(2) + b;

会将所有的分词进行分类

(3)语义分析

语义分析阶段基于抽象语法树(AST)进行更深层次的程序语义检查。其主要任务包括:验证变量和函数的使用是否合法(如是否存在未声明或重复声明)、进行类型推断与检查、构建符号表以记录标识符信息,以及检查函数调用的匹配性(如参数数量与类型是否正确)。该阶段不关注语法结构是否正确,而侧重于确保程序的逻辑和语义符合语言规范,是保证程序正确性的重要环节。

(4)代码生成

在通过语义分析并完成可能的优化处理后,代码生成阶段将 AST 转换为目标代码。对象代码的形式因编译目标而异,可以是机器码、字节码(如 Java 字节码),或其他中间代码。这一阶段直接生成最终可执行或可解释的代码,是编译流程中的产出阶段。

(5)链接

若程序由多个模块或文件组成,链接器负责将它们合并为一个完整的可执行文件或库。链接过程主要包括地址分配、解析跨模块的符号引用(如函数和变量),以及重定位等操作,确保程序中不同部分能够正确关联与协同工作。

(6)加载和执行

生成的可执行文件由操作系统加载到内存中,并进行必要的初始化工作,最终由 CPU 执行。在此阶段,程序正式运行,实现其设计功能。

2.AST对爬虫的意义

随着技术的革新,越来越多的前端为了保护其网站不被第三方爬取,使用了大量的混淆代码,让爬虫工程师越来越难找到其核心参数加密代码。有时候定位到加密的地方,面对一大坨乱如麻的代码,内心也是拒绝的。

这个时候,希望有一种工具,尽可能的将被混淆的代码进行处理,使其可读性大大增加,使爬虫工程师能够轻而易举的进行定位,抠出其核心的加密代码。

AST用在这里,只是一种辅助工具,并不能直接帮你找到核心的代码,还是得自己去分析,静态分析也好,动态调试也好,目的只有一个

二、AST语法学习

参考地址:https://www.babeljs.cn/docs/

在线解析:https://astexplorer.net

//练习语法
var a = "\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054"

1.AST输出树结构

type:表示当前节点的类型,我们常用的类型判断方法,就是判断当前的节点是否为某个类型。

start:表示当前节点的起始位。

end:表示当前节点的末尾。

loc:表示当前节点所在的行列位置,里面也有start与end节点,这里的start与上面的start是不同的,这里的start是表示节点所在的行列位置,而end表示的是节点所在末尾的行列位置

errors:是File节点所特有的属性,可以不用理会。

program:包含整个源代码,不包含注释节点。

  • sourceType:通常用于标识源代码的类型,以告诉解析器或编译器它正在处理的代码是模块代码还是脚本代码(Script Module)
  • body:包含了程序的主体代码,即程序的主要逻辑
    • 语句块:“body" 可能表示一组语句,通常是一个代码块,这些语句按顺序执行。
    • 函数体:对于函数或方法定义,“body”包含了函数的主体代码,即函数内部的语句和逻辑。
    • 类定义:对于类定义,“body”可能包含类的成员,如属性和方法。
    • 模块内容:对于模块或文件,“body”可能包含文件中的顶级语句和声明。
    • declarations:通常用于表示变量、常量、函数、类等的声明
    • id:是函数,变量,类的名称
    • init:通常代码声明的初始化值

comments:源代码中所有的注释会在这里显示。

2.常见节点类型

3.babel 库

根据官网介绍,它是一个JavaScript编译器,主要用于将ECMAScript 2015+版本的代码转换为向后兼容的JavaScript语法,以便能够运行在当前和旧版本的浏览器或其他环境中。

  1. @babel/core :Babel 编译器本身,提供了 babel 的编译 API;
  2. @babel/parser:将 JavaScript 代码解析成 AST 语法树;
  3. @babel/traverse :遍历、修改 AST 语法树的各个节点;
  4. @babel/generator :将 AST 还原成 JavaScript 代码;
  5. @babel/types :判断、验证节点的类型、构建新 AST 节点等。
// 安装命令
npm install @babel/core --save-dev

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

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

相关文章

网站开发如何查看请求体包头建设厅官方网站

之前做页面抓取&#xff0c;数据采集等功能的时候&#xff0c;第一个想到的就是用正则表达式去匹配页面内容。但是对于像我这种&#xff0c;正则只懂皮毛的人来说&#xff0c;写正则是真的很恶心的一件事。去网上找&#xff0c;也不一定能改成自己需要的正则。今天给大家推荐一…

2025/9/30

2025/9/30钳工工程实训 英语听说能力训练

天津购物网站搭建唐山地方志网站建设

来源&#xff1a;微信公众号科技咨询频道作者&#xff1a;谢黎、张志强&#xff0c;中国科学院成都文献情报中心兰德公司2021年5月24日发布《美国5G时代&#xff1a;在保障国家和人民的同时获得竞争优势》报告。报告援引美国国防创新委员会、联邦政府的观点&#xff0c;声称5G是…

做蛋糕需要建议网站不丹阳网站

这篇回答两个问题&#xff1a; 1.为什么在 pycharm中打开新的project&#xff0c;切换interpreter 之后发现自己之前装的库消失了&#xff1f; 2.为什么 interpreter 切换到python3.8了&#xff0c; terminal 还是在 3.9&#xff1f;&#xff1f; 问题的关键&#xff1a;搞懂什…

tcp与udp 协议 - 摘星

TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议) 是 TCP/IP 协议族中最核心的两种传输层协议,二者在可靠性、连接方式、传输效率等维度存在本质区别, 适用于不…

赛前训练4 extra 字典树

A 板子。实现 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stdlib.h> #include <vector> #include <…

CF1450E Capitalism

首先你发现这个条件特别能用差分约束描述,特别是构造方案。 但是你无法处理相同的情况,我们注意到相连的边的两个点的 \(a\) 奇偶性必定不同,于是这必定是一张二分图,检验一下是不是二分图即可。 然后跑普通的差分…

织梦如何做几种语言的网站移动互联网开发平台基于linux安卓

“同物异谱&#xff0c;同谱异物”会对影像分类产生的影响&#xff0c;加上高分辨率影像的光谱信息不是很丰富&#xff0c;还有经常伴有光谱相互影响的现象&#xff0c;这对基于像素的分类方法提出了一种挑战&#xff0c;面向对象的影像分类技术可以一定程度减少上述影响。 本…

手游网站怎么做可做百度百科参考资料的网站

编辑距离算法其实就是&#xff0c;在规定的编辑操作(替换字符串、插入字符串、删除字符串)中&#xff0c;经过几步可以把一个字符串变成另一个字符串&#xff0c;而这个所需的步数就是你的编辑距离。 测试样例&#xff1a; str1 abc str2 yabd 表里的每一个值都代表着将s…

网站建设一年600wordpress自动添加标签

声明常量&#xff1a;使用const关键字定义一个常量&#xff0c;不允许对其进行更改。例如&#xff1a; const int PI 3.1415926;修饰函数参数&#xff1a;加上const限定符可以确保函数不会修改传入的参数值。例如&#xff1a; void print(const int num) {// num不能在函数内…

Java 在Word 文档中添加批注:高效文档协作的利器 - 指南

Java 在Word 文档中添加批注:高效文档协作的利器 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

ui网站开发国内互联网公司排名2021

学习时间表 周次内容学习时长建议第一周 【第一章-1】JDK下载与配置电脑的环境变量&#xff0c;并在电脑上运行第一个java程序 2h【第一章-2】IDEA开发环境的安装与编写第一个程序 2h 第二周【第二章-1】Java编程基础——变量与常量1h【第二章-2】Java编程基础…

二分图最大匹配 匈牙利算法

模板:洛谷p3386 #include<bits/stdc++.h> using namespace std; const int N=5e4+10; int vis[N],match[N]; vector<int> edges[N]; int n,m,e; bool dfs(int u){for(int &v:edges[u]){if(vis[v])con…

用来查数据的网站怎么建设最新网页版传奇游戏

一、axios 简介 axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;可用于浏览器和 Node.js 环境&#xff0c;支持以下特性&#xff1a; 发送 HTTP 请求&#xff08;GET/POST/PUT/DELETE 等&#xff09; 拦截请求和响应 自动转换 JSON 数据 取消请求 并发请求处理 二…

2025 年脱硫剂厂家 TOP 企业品牌推荐排行榜,氧化铁,羟基氧化铁,常温氧化铁,沼气,天然气,煤气,煤层气,液化气,二氧化碳,氨气脱硫剂公司推荐

在当前工业快速发展的背景下,气体脱硫成为保障生产安全、减少环境污染的关键环节。无论是天然气、沼气行业,还是甲醇、化肥生产领域,都对脱硫剂的性能有着极高要求。优质的脱硫剂不仅需要具备高脱硫精度,还要有稳定…

网站内部优化是什么创建网站有免费的吗

3月29日&#xff0c;以“新零售、新流量、新风口”为主题的2024喜尔康浙江省经销商培训会在喜尔康总部正式开始举办。活动旨在智能新时代赋能经销商伙伴&#xff0c;通过抓住行业智能化风口&#xff0c;实现喜尔康与经销商的共赢&#xff0c;决胜未来新零售商机。 喜尔康始终致…

2025雨棚生产厂家 TOP 企业品牌推荐排行榜,西安,陕西,西北推拉雨棚,推拉,移动,活动,户外,电动伸缩雨棚推荐这十家公司!

引言在遮阳遮雨行业快速发展的当下,雨棚作为工业、商业、体育休闲等多个领域的重要设施,市场需求持续增长。然而,当前雨棚生产厂家数量众多,行业整体呈现出良莠不齐的态势。部分厂家缺乏核心技术,生产的雨棚在结构…

百度找不到我的网站了品牌网站建设渠道

在Spring Boot项目中预防CSRF攻击通常涉及利用Spring Security框架提供的内置支持。Spring Security已经为CSRF提供了默认的防护措施&#xff0c;但根据应用的特定需求&#xff0c;可能需要进行一些配置调整或扩展。下面是一系列步骤和建议&#xff0c;用于在Spring Boot项目中…

建设银行辽宁招聘网站新公司怎么建立自己的网站

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) 一 音频4A算法是? 音频4A算法是指自动增益控制(Automatic Gain Control, AGC)、自动噪声抑制(Automatic Noise Suppression, ANS)和自动回声消除(Automatic Echo Cancellation, AEC),主动降噪ANC(Active Noi…

2025 年木工机械设备厂家 TOP 企业品牌推荐排行榜,深度剖析木工机械设备推荐这十家公司!

引言在木工行业蓬勃发展的当下,木工机械设备的质量与性能对生产效率和产品质量起着决定性作用。随着市场需求的日益多元化和精细化,木工企业对机械设备的要求也水涨船高,不仅期望设备具备高精度、高稳定性,还希望其…