AST 技术进行 JavaScript 反混淆实战
一、AST 技术核心原理
抽象语法树(AST) 是代码的“骨架”,它把代码拆解成一个个节点,就像把一棵大树拆成树枝、树叶一样。通过分析和修改这些节点,我们可以精准地还原代码的逻辑。
二、实战案例 1:还原字符串编码
混淆代码特征
混淆代码会把字符串拆成数组,然后通过索引访问,比如:
const _0x5c0d = ["Hello", "World", "log", "split", "join"];
console[_0x5c0d[2]](_0x5c0d[0][_0x5c0d[3]]("")[_0x5c0d[4]]("-"));
// 输出 "H-e-l-l-o"
反混淆步骤
-
安装依赖
npm install @babel/parser @babel/traverse @babel/generator
-
解析和还原代码:
-
用 Babel 把代码解析成 AST。
-
遍历 AST,找到字符串数组的定义。
-
替换所有数组索引访问为实际的字符串值。
-
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const generator = require("@babel/generator").default;const code = `
const _0x5c0d = ["Hello", "World", "log", "split", "join"];
console[_0x5c0d[2]](_0x5c0d[0][_0x5c0d[3]]("")[_0x5c0d[4]]("-"));
`;// 解析为 AST
const ast = parser.parse(code);// 遍历 AST 节点
traverse(ast, {VariableDeclarator(path) {// 找到字符串数组if (path.node.id.name === "_0x5c0d") {const stringArray = path.node.init.elements.map(e => e.value);// 替换所有数组引用path.scope.traverse(path.scope.block, {MemberExpression(subPath) {const node = subPath.node;if (node.object.name === "_0x5c0d" && node.property.type === "NumericLiteral") {const value = stringArray[node.property.value];subPath.replaceWith({ type: "StringLiteral", value });}}});}}
});// 生成还原后的代码
const output = generator(ast).code;
console.log(output);
输出结果:
console["log"]("Hello"["split"]("")["join"]("-"));
// 进一步简化为:console.log("H-e-l-l-o");
三、实战案例 2:修复控制流扁平化
混淆代码特征
混淆代码会把逻辑打乱成一个状态机,比如:
function getSum(n) {let state = 0, total = 0, i = 0;while (true) {switch (state) {case 0: state = 1; break;case 1: if (i < n) state = 2; else state = 3; break;case 2: total += i; i++; state = 1; break;case 3: return total;}}
}
反混淆步骤
-
识别状态机模式:
-
找到
switch-case
结构。 -
分析
state
变量的跳转逻辑。
-
-
重构逻辑:
-
把状态机逻辑还原成正常的循环结构。
-
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const t = require("@babel/types");const code = `...上述控制流代码...`;
const ast = parser.parse(code);traverse(ast, {FunctionDeclaration(path) {const body = path.get("body.body");const switchStmt = body.find(p => p.isSwitchStatement());// 提取状态转移逻辑const stateMap = new Map();switchStmt.get("cases").forEach(casePath => {const test = casePath.node.test.value;const consequent = casePath.get("consequent");stateMap.set(test, consequent);});// 重构为 for 循环const newBody = [t.variableDeclaration("let", [t.variableDeclarator(t.identifier("total"), t.numericLiteral(0))]),t.forStatement(t.variableDeclaration("let", [t.variableDeclarator(t.identifier("i"), t.numericLiteral(0))]),t.binaryExpression("<", t.identifier("i"), t.identifier("n")),t.updateExpression("++", t.identifier("i")),t.blockStatement([t.expressionStatement(t.assignmentExpression("+=", t.identifier("total"), t.identifier("i")))])),t.returnStatement(t.identifier("total"))];path.get("body").replaceWith(t.blockStatement(newBody));}
});// 输出还原后代码
console.log(generator(ast).code);
输出结果:
function getSum(n) {let total = 0;for (let i = 0; i < n; i++) {total += i;}return total;
}
四、对抗混淆的高级技巧
-
处理多层嵌套:
-
混淆代码可能把数组多层嵌套,需要递归展开所有层级。
-
-
动态解密函数处理:
-
若字符串解密通过函数实现,AST 需模拟执行函数逻辑。
-
-
符号执行优化:
-
对条件进行数学推导,消除永远无法执行的分支。
-
五、工具链推荐
工具 | 用途 | 示例命令 |
---|---|---|
@babel/parser | 代码解析为 AST | parser.parse(code) |
@babel/traverse | 节点遍历与修改 | traverse(ast, { ... }) |
@babel/generator | 从 AST 生成代码 | generator(ast).code |
六、总结
AST 反混淆的核心步骤:
-
解析:把代码转换为结构化的 AST。
-
识别模式:找到字符串数组、控制流状态机等特征。
-
语义还原:通过节点替换或逻辑重构恢复原始逻辑。
-
验证:确保重构后的代码功能与原混淆代码一致。
注意事项:
-
混淆工具可能插入虚假节点(如无用循环),需结合数据流分析过滤。
-
遇到
eval
或Function
动态代码时,需结合动态执行。 -
推荐结合 Prettier 格式化还原后的代码,提升可读性。
通过 AST 技术,我们可以从“代码加密 → 结构解析 → 逻辑还原”完成全链路逆向工程,是应对现代混淆技术的核心手段!
相关文章:
AST 技术进行 JavaScript 反混淆实战
一、AST 技术核心原理 抽象语法树(AST) 是代码的“骨架”,它把代码拆解成一个个节点,就像把一棵大树拆成树枝、树叶一样。通过分析和修改这些节点,我们可以精准地还原代码的逻辑。 二、实战案例 1:还原字…...
基于ECharts+Spark的疫情防控数据分析平台(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,特别是近几年来,新冠疫情出现以来,疫情防控数据分析平台当然不能排除在外。我本次开发的疫情防控数据分析平台是在…...
wireshark过滤器表达式的规则
1.抓包过滤器语法和实例 抓包过滤器类型Type(host、net、port)、方向Dir(src、dst)、协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、逻辑运算符(&&与、|| 或、!非&am…...
使用 Python 扫描 Windows 下的 Wi-Fi 网络实例演示
使用 Python 扫描 Windows 下的 Wi-Fi 网络 代码实现代码解析 1. 导入库2. 解码混合编码3. 扫描 Wi-Fi 网络4. 运行函数 这是我当前电脑的 wifi 连接界面。 这个是运行的效果图: 代码实现 我们使用了 Python 的 subprocess 模块来调用 Windows 的内置命令 netsh…...
Redis 字符串(String)详解
1. 什么是字符串类型 在 Redis 中,字符串(String) 是最基本的数据类型。它可以包含任何数据,比如文本、JSON、甚至二进制数据(如图片的 Base64 编码),最大长度为 512 MB。 字符串在 Redis 中不…...
【Taro3.x + Vue3】搭建微信小程序
IOS环境为例 打开终端环境有多种办法,例举一个:在访达里新建一个文件夹,鼠标右键选择。 一、先安装Taro的环境 npm install -g tarojs/cli安装完成后,可以输入命令检验是否安装成功: taro --version二、创建项目 …...
P8668 [蓝桥杯 2018 省 B] 螺旋折线
题目 思路 一眼找规律题,都 1 0 9 10^9 109说明枚举必然超时,找规律,每个点找好像没有什么规律,尝试找一下特殊点,比如:对角线上的点 4 16 36(右上角) 4k^2,看在第几层(…...
【14】数据结构之哈夫曼树篇章
目录标题 哈夫曼树哈夫曼树的定义哈夫曼树的构造哈夫曼编码哈夫曼树的实现 哈夫曼树 哈夫曼树的定义 路径:从一个结点到另一个结点的路线树的路径长度:从树根到树中每个结点的路径长度之和结点的权:在一些应用中,赋予树中结点的…...
初识SpringAI(接入硅基流动deepseek)
①创建项目 ②application.yml spring:application:name: pgs-aiai:openai:api-key: sk-vrozloxjpjgkozaggtodbmwyfmubmxqpdpbvbbxpcgleanugbase-url: https://api.siliconflow.cn/chat:options:model: deepseek-ai/DeepSeek-V3 api-key:去硅基流动官网生成你的密钥…...
两个有序序列合并算法分析
一 问题背景 合并两个有序序列是常见操作,例如在归并排序中。传统方法需要额外空间,时间复杂度为 O(n)。但若要求原地合并(不占用额外内存),则需借助 手摇算法(或称内存反转或三次反转算法)。 二 手摇算法原理 手摇算法通过三次反转操作,实现数组片段的原…...
Robot---SPLITTER行星探测机器人
1 背景 先给各位读者朋友普及一个航天小知识,截止到目前为止,登陆火星的火星车有哪些?结果比较令人吃惊:当前只有美国和中国登陆过火星。 “勇气”号(Spirit):2004年1月4日,美国国家…...
kafka的topic扩容分区会对topic任务有什么影响么
在 Kafka 中对 Topic 进行扩容分区会对相关任务产生多方面的影响,下面为你详细介绍: 积极影响 增强并发处理能力:Kafka 中数据是以分区为单位进行并行处理的,增加分区数量意味着可以让更多的消费者并行消费数据。比如࿰…...
每日一题(小白)模拟娱乐篇27
由题意可以得知这是一道暴力模拟的题目,我们只需要根据题意说的模拟整个过程即可。首先需用循环接收n个数字,每次判断这个数字是否出现过,若没有出现则为对应的负值,若出现过则需要将这个坐标减去之前坐标的值再减一返回ÿ…...
进行性核上性麻痹患者,饮食 “稳” 健康
进行性核上性麻痹作为一种复杂且罕见的神经系统退行性疾病,给患者的身体机能和日常生活带来严重挑战。在积极接受专业治疗的同时,合理的饮食安排对于维持患者营养状况、缓解症状及提升生活质量起着关键作用。以下为患者提供一些健康饮食建议。 首先&…...
GitLab之搭建(Building GitLab)
GitLab之搭建 “ 在企业开发过程中,GitLab凭借其强大的版本管理、CI/CD集成和项目管理功能,成为许多团队的首选工具。本文将探讨GitLab的基础介绍、搭建过程、权限管理、代码审查以及团队知识管理等方面。通过详细的步骤和实用的技巧,旨在帮…...
R 语言科研绘图第 38 期 --- 饼状图-玫瑰
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
array和list在sql中的foreach写法
在MyBatis中,<foreach>标签用于处理集合或数组类型的参数,以便在SQL语句中动态生成IN子句或其他需要遍历集合的场景。以下是array和list在SQL中的<foreach>写法总结。 <if test"taskIds ! null and taskIds.length > 0">…...
国内MCP服务有哪些?MCP服务器搜索引擎哪家好?
随着MCP(Model Context Protocol)协议的广泛应用,国内出现了越来越多的MCP服务提供商,这些服务覆盖了从开发工具、数据科学到金融、游戏等多个领域。 如果你对MCP协议和相关开发感兴趣,可以访问AIbase(htt…...
二叉树的应用
目录 一、二叉树遍历算法的应用 二、树的存储结构 1、双亲表示法 2、孩子表示法 带双亲的孩子链表 3、孩子兄弟表示法(左孩子、右兄弟)较为普遍 三、森林与二叉树的转换 四、哈夫曼树 哈夫曼(Huffman)树的构造 一、二叉树…...
【LaTeX】
基本使用 \documentclass 类型:文章(article)、报告(report)、书(book) 中文的文章是ctexart,中文字体是UTF8 \documentclass[UTF8]{ctexart} []说明可以省略不写的意思…...
Java基础 - 泛型(基本概念)
文章目录 基本概念参数化类型类型安全和编译时检查 为什么需要泛型?解决类型安全问题避免重复代码提高可读性和维护性 泛型(Generics)是编程语言中一种支持参数化类型的特性,允许在定义类、接口、方法时使用类型参数(T…...
面试之《前端信息加密》
前端代码是直接暴漏给用户的,请求的接口也可以通过控制台network看到参数,这是不够安全的,如果遇到坏人想要破坏,可以直接修改参数,或者频繁访问导致系统崩溃,或数据毁坏。 所以信息加密在某些场合就变得非…...
【含文档+PPT+源码】基于微信小程序的小区物业收费管理系统
项目视频介绍: 毕业作品基于微信小程序的小区物业收费管理系统 课程简介: 本课程演示的是一款基于微信小程序的小区物业收费管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目…...
KDD 2025 顶会最新力作,多变量时间序列预测登顶!
在多变量时间序列预测领域,如何高效捕捉时间分布变化和通道间复杂关系是两大核心挑战。传统方法往往难以同时处理时间模式的异质性和通道间的噪声影响。近期,基于时频结合的方法在这一领域取得了显著进展。本文总结了两篇创新性论文,分别从时…...
for循环的优化方式、循环的种类、使用及平替方案。
本篇文章主要围绕for循环,来讲解循环处理数据中常见的六种方式及其特点,性能。通过本篇文章你可以快速了解循环的概念,以及循环在实际使用过程中的调优方案。 作者:任聪聪 日期:2025年4月11日 一、循环的种类 1.1 默认有以下类型 原始 for 循环 for(i = 0;i<10;i++){…...
OpenFeign 的实现原理详解
前言 OpenFeign 是一个声明式的 HTTP 客户端,它简化了服务间的 HTTP 调用。通过简单的注解和接口定义,开发者可以轻松调用远程服务,而无需手动编写复杂的 HTTP 请求代码。本文将深入探讨 OpenFeign 的实现原理,并结合源码分析其核…...
const关键字理解
const关键字主要的作用是告诉编译器这个东西是个常量,不可被修改。 或者是用来和指针玩一些奇奇怪怪的东西,这玩意面试八股文常青树。 const int* p://表示指针指向的内容不能更改,指针可以更改。 int* const p: //表示指针不能…...
操作系统 4.3-生磁盘的使用
磁盘的物理组成 盘面: 磁盘由多个盘面组成,每个盘面上都有数据存储的区域。 磁道: 每个盘面上都有若干个同心圆,这些同心圆称为磁道。磁道是数据存储的路径。 扇区: 磁道被进一步划分为若干个扇区,扇区…...
Uniapp Vue 实现当前日期到给定日期的倒计时组件开发
应用场景与需求分析 在移动端应用开发中,倒计时功能是常见的交互需求,例如限时促销活动、订单超时提醒、考试倒计时等场景。本文将基于 Uniapp 框架,实现一个从当前日期到给定日期的倒计时组件,支持显示 HH:mm:ss 格式的剩余时间…...
3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换
3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换 3dmax标准材质/vr/cr材质贴图转PBR材质贴图插件,支持多维子材质转换...
操作系统 3.3-多级页表和快表
分页的问题 这张幻灯片讨论了操作系统中内存管理的一个核心问题:页大小与页表大小之间的权衡。 页(Page)是内存管理中的一个基本概念,指的是将虚拟内存分割成固定大小的块,以便于管理和访问。页的大小直接影响内存空间…...
Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)
阿里云的KMS(Key Management Service)也是一种托管式密钥管理服务,帮助用户安全地创建、控制和使用密钥,保护敏感数据。通过使用KSM,您可以专注于构建和优化应用程序,而不必担心密钥管理的复杂性。 1、主要…...
游戏引擎学习第218天
构建并运行,注意一下在调试系统关闭前人物的移动速度 现在我准备开始构建项目。如果我没记错的话,我们之前关闭了调试系统,主要是为了避免大家在运行过程中遇到问题。现在调试系统没有开启,一切运行得很顺利,看到那个…...
城电科技 | 光伏太阳花:碳减排路上的璀璨新光光伏智慧花
当谈及 “碳减排” 与 “碳中和”,你脑海中率先浮现的是什么?想必很多人都会想到太阳能发电。太阳能光伏,作为人类取之不尽、用之不竭的绿色清洁能源,具备充分的清洁性、高度的安全性以及相对的广泛性。正因如此,在探讨…...
AI领域再突破,永洪科技荣获“2025人工智能+创新案例”奖
在2025年的今天,人工智能已从技术概念全面渗透至产业核心。中国作为全球AI技术应用的前沿阵地,正通过“人工智能”行动加速推进技术与实体经济深度融合。 这一背景下,永洪科技凭借其“国内某头部ICT人力资源板块GenAI项目”荣获“2025全国企业…...
大模型day1 - 什么是GPT
什么是GPT 全称 Generative Pre-trained Transformer 是一种基于 Transformer 架构的大规模 预训练 语言模型,由OpenAI研发,但GPT仅仅只是借鉴了Transformer 中 Decoder 的部分,并且做了升级 Transformer 架构 Transformer架构 是一种用于…...
飞凌嵌入式T527核心板正式发布OpenHarmony4.1系统,实现从芯片架构到操作系统的全链路国产化
飞凌嵌入式FET527N-C核心板正式发布OpenHarmony4.1系统,实现了从芯片架构到操作系统的全链路国产化。该产品具备灵活可编程、高效能运算、低成本控制等多重优势,通过多核异构设计同步支持边缘智能计算与精准实时控制,能够满足智能制造、能源管…...
机动车号牌管理系统设计与实现(代码+数据库+LW)
摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对机动车号牌信息管理的提升&…...
测试模板1
本篇技术博文摘要 🌟 引言 📘 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮,一名什么都会一丢丢的网络安全工程师,也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...
小试牛刀-抽奖程序
编写抽奖程序 需求:设计一个抽奖程序,点击抽奖按钮随机抽取一个名字作为中奖者 目标:了解项目结构,简单UI布局,属性方法、事件方法,程序运行及调试 界面原型 待抽奖: 点击抽奖按钮&#x…...
Foundry框架在FISCO BCOS区块链中的高级应用与实战技巧
引言:从入门到精通的进阶之路 在看过我发布的《FISCO BCOS区块链智能合约测试利器:Foundry框架从入门到实战》基础上,我们可以进一步深入探索Foundry框架在FISCO BCOS生态中的高级应用场景。Foundry作为一款强大的区块链开发工具集,其功能远不止于基础测试,它还能为FISCO…...
反转链表系列
206. 反转链表 - 力扣(LeetCode) /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int …...
算力租赁:数字经济时代的 “电力革命”—— 从资源租赁到创新生态的范式重构
引言:当算力成为新 “石油”,租赁模式如何重塑商业未来? 在数字经济浪潮中,算力早已超越传统硬件范畴,成为驱动企业创新的核心生产要素。据 IDC 预测,全球数据总量将在 2025 年突破 175 ZB,而人…...
Go:基本数据
文章目录 整数浮点数复数布尔值字符串字符串字面量UnicodeUTF - 8字符串和字节 slice字符串和数字的相互转换 常量常量生成器 iota无类型常量 整数 分类 Go 的整数类型按大小分有 8 位、16 位、32 位、64 位 ,同时有符号整数包括int8、int16、int32、int64 &#…...
金融行业软件介绍
金融,本质为货币资金的融通,是经济活动中至关重要的领域。它围绕货币、信用、利率等核心要素运转,借助银行、证券机构、保险机构等众多主体,在货币市场与资本市场中实现资金的调配与流转,具有优化资源配置、分散风险及…...
Python的那些事第四十九篇:基于Python的智能客服系统设计与实现
基于Python的智能客服系统设计与实现 摘要 随着人工智能技术的飞速发展,智能客服系统逐渐成为企业提升客户服务质量和效率的关键工具。本文详细介绍了基于Python的智能客服系统的设计与实现方案,涵盖了系统架构、核心功能、技术选型及优化建议,旨在为企业构建高效、智能的客…...
vscode报错:unins000.exe 尝试在目标目录创建文件时发生一个错误
打开vscode,报错 这个错误提示表明在卸载或安装 Visual Studio Code 时,系统拒绝访问目标目录中的文件 unins000.exe。以下是解决此问题的有效方法: 检查文件权限 找到文件所在目录(如 D:\software\Microsoft VS Codeÿ…...
当气象水文遇见R语言——破解时空数据的“达芬奇密码“
在气象水文科学领域,数据从来不只是简单的数字阵列。台风路径的时空跳跃、流域径流的非线性涨落、气候要素的混沌演变,这些充满不确定性的自然现象转化为数据时,呈现出多维时空交织的复杂图景。研究人员常常要在TB级遥感数据中捕捉毫米级降水…...
LEARNING DYNAMICS OF LLM FINETUNING【论文阅读笔记】
LEARNING DYNAMICS OF LLM FINETUNING 一句话总结 作者将LLM的学习动力机制拆解成AKG三项,并分别观察了SFT和DPO训练过程中正梯度信号和负梯度信号的变化及其带来的影响,并得到以下结论: SFT通过梯度相似性间接提升无关…...
【射频仿真学习笔记】变压器参数的Mathematica计算以及ADS仿真建模
变压器模型理论分析 对于任意的无源电路或者等效电路,当画完原理图后,能否认为已经知道其中的两个节点?vin和vout之间的明确解析解 是否存在一个通用的算法,将这里的所有元素都变成了符号,使得这个算法本身就是一个函…...