讲师中心 微信公众号
AI工具推荐 视频效率加速

Python爬虫怎么应对复杂的JS混淆_利用AST抽象语法树进行解密

夏涛酱_4321

夏涛酱_4321

发布时间:2026-04-25 19:04:19

|

493人浏览过

|

来源于php中文网

原创

JS混淆字符串解密不能靠正则硬匹配,因混淆结构多变且易误伤;稳定方式是基于AST静态分析,精准定位String.fromCharCode、atob等解密模式,忽略无副作用表达式,兼顾安全与兼容性。

python爬虫怎么应对复杂的js混淆_利用ast抽象语法树进行解密

JS混淆字符串解密为什么不能靠正则硬匹配

因为混淆后的代码结构千变万化:有的用数组索引拼接,有的套多层 atob + eval + 自调用函数,还有的把字符串拆成 Unicode 码点再动态组装。正则一换就失效,而且容易误伤正常 JS 逻辑。

真正稳定的方式是模拟 JS 执行环境或还原语义——AST 就是后者的关键入口:它不关心变量名、空格、括号风格,只保留语法结构和运算关系,正好绕过混淆的表层干扰。

  • 混淆常把字符串藏在 Array.prototype.map 或 String.fromCharCode 调用链里,AST 能准确定位到这些节点
  • 某些混淆器会插入无副作用的表达式(如 void 0、!1),AST 可以安全忽略它们,只提取有值返回的子树
  • 直接用 execjs 或 PyExecJS 运行可能触发反调试(比如检查 window、document),而 AST 解析纯静态,零风险

用 esprima + ast.walk 提取字符串字面量和解密逻辑

Python 本身不原生解析 JS,得靠第三方库。推荐 esprima(通过 esprima-python 绑定)或更轻量的 slimit;注意别用已停更的 pyjsparser,对 ES6+ 支持差,遇到箭头函数或模板字符串会直接报错 ParseError: Unexpected token。

核心思路是:先 parse 成 AST,再遍历所有 Literal 和 CallExpression 节点,识别出常见解密模式:

立即学习“Python免费学习笔记(深入)”;

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载
  • atob("SGVsbG8=") → 直接 base64 解码
  • String.fromCharCode(72, 101, 108, 108, 111) → 提取数字参数并转字符
  • ["H", "e", "l", "l", "o"].join("") → 检查 ArrayExpression + CallExpression 的 callee.property.name === "join"

示例片段(简化版):

import esprima
from esprima import walk
<p>def extract_strings(node):
if isinstance(node, esprima.nodes.Literal) and isinstance(node.value, str):
return node.value
if isinstance(node, esprima.nodes.CallExpression):
if (hasattr(node.callee, 'name') and node.callee.name == 'atob' and
hasattr(node.arguments[0], 'value')):
return base64.b64decode(node.arguments[0].value).decode()</p><h1>其他模式类似处理...</h1>

遇到动态 key 或自执行函数怎么办

有些混淆会把解密函数本身也混淆,比如 (function(a,b){...})("key","data"),或者用对象属性名当密钥:obj[_0x1234[0]]。这时候光看字符串不够,得做简单符号求值。

  • 优先提取所有 ArrayExpression 字面量(如 ["hello"]),统一转成明文备用
  • 对 MemberExpression(如 a[b]),若 b 是 Literal,直接取索引;若是 Identifier,需向上找同作用域的赋值语句(比如 var b = 0;)
  • 避免递归求值整个作用域——太重且易出错。只处理一级变量绑定 + 字面量数组,覆盖 90% 常见混淆即可

典型坑:_0x1234 这类变量名常被重复声明(不同函数内),不能全局缓存;每次进入新 FunctionExpression 都要清空当前作用域映射。

混淆升级后 AST 方案还灵不灵

当混淆器开始插入控制流扁平化(如 while(true){switch(_0x1){case 0:...break;case 1:...}})或使用 WebAssembly 加载密钥时,纯 AST 就力不从心了。这时候必须切换策略:

  • 先用 AST 定位到可疑的 while/switch 块,提取 case 分支里的字符串操作,再用 Python 模拟执行该分支(而非整个函数)
  • 对 WASM 场景,基本放弃静态分析——改用 playwright 启动真实 Chromium,hook WebAssembly.instantiate 并 dump 内存中的解密结果
  • 记住:AST 不是银弹,它的价值在于「快、稳、可嵌入」,适合做第一层过滤;复杂逻辑该上浏览器环境就得上,别硬扛

最常被忽略的一点:混淆代码里可能混着真实业务逻辑,比如某个 atob 解出来是 URL,但后面还有个 .replace(/\./g, "/") 才是最终请求地址——AST 解析必须连同后续调用链一起捕获,不能只截第一个函数调用。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1791

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4664

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1749

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

27597

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3327

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3347

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1203

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn