如何在Python中利用AST技术还原复杂的前端加密JS?

雨芳同学_2052

雨芳同学_2052

2026-09-23

694人浏览

原创

ast解析js混淆代码可行但有局限:仅适用于字符串拼接型(如atob、fromcharcode),遇eval、function等动态执行需补环境;webpack代码应先正则定位再局部ast;python复现需处理js隐式类型转换。

如何在python中利用ast技术还原复杂的前端加密js?

直接用 AST 解析 JS 混淆代码是可行的,但必须明确一点:AST 不是万能解药,它只负责“看懂结构”,不负责“执行逻辑”。很多加密函数依赖 windowdocumentatob 或动态环境检测,纯 AST 解析拿不到最终字符串——你得先判断这段 JS 是“可静态还原”还是“必须补环境执行”。

怎么快速判断该不该上 AST?

打开混淆 JS 文件,在浏览器控制台里搜这几个关键词:

  • atob(btoa(String.fromCharCode(.join( → 这类属于“字符串拼接型”,AST 可安全提取
  • eval(Function(setTimeout(location.href → 这类含动态执行或 DOM 依赖,AST 无法还原,得换方案
  • void 0!1~[] → 这些是无副作用干扰项,AST 遍历时可跳过,不用硬匹配

如果搜索结果集中在第一类,就适合 AST;第二类占比高,别浪费时间写遍历器,直接切到 PyExecJS 或 RPC。

用 esprima-python 提取 base64 和 fromCharCode 字符串

注意:不要用已停更的 pyjsparser,它对 ES6+ 支持差,遇到箭头函数或模板字符串会直接抛 ParseError: Unexpected token。推荐 esprima-python(绑定 Esprima 4.x)或轻量级 slimit

核心逻辑是递归遍历 CallExpression 节点,识别调用名和参数类型:

def extract_strings(node):
    if isinstance(node, esprima.nodes.CallExpression):
        if hasattr(node.callee, 'name') and node.callee.name == 'atob':
            if isinstance(node.arguments[0], esprima.nodes.Literal) and isinstance(node.arguments[0].value, str):
                return base64.b64decode(node.arguments[0].value).decode('utf-8')
        elif (hasattr(node.callee, 'property') and 
              hasattr(node.callee.property, 'name') and 
              node.callee.property.name == 'fromCharCode'):
            nums = []
            for arg in node.arguments:
                if isinstance(arg, esprima.nodes.Literal) and isinstance(arg.value, int):
                    nums.append(arg.value)
            if nums:
                return ''.join(chr(n) for n in nums)
    return None

这个函数只处理最常见两种模式,不试图覆盖所有混淆变体——实际项目中,90% 的字符串混淆都落在这两类里。

A Python CLI skill for Cutout.Pro visual APIs — background removal, face cutout, and photo enhancement. Supports file upload & image URL input.
A Python CLI skill for Cutout.Pro visual APIs — background removal, face cutout, and photo enhancement. Supports file upload & image URL input.

调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。

下载

webpack 打包代码怎么拆?别硬 parse 整个 bundle

混淆 JS 来自 webpack 打包时,整个文件可能有 10k+ 行,但真正生成 sign 的逻辑往往藏在某个闭包里,比如:function r(e){...}var t={...}。硬解析整棵树效率低还容易内存溢出。

更实用的做法是先定位目标函数再局部 AST:

  • 用正则粗筛:搜索 /function\s+\w+\s*\([^)]*\)\s*\{[^}]*sign[^}]*\}//\.sign\s*=\s*[\w$]+/
  • 把匹配到的代码块(比如从 function getSign 到对应右括号)单独拎出来,喂给 esprima.parseScript()
  • 这样 AST 树深度可控,遍历快,且避免被打包器注入的无关模块干扰

别忘了 webpack 常把字符串数组存成 ["a","b","c"].join("") 形式,这种要额外检查 ArrayExpression + CallExpression.callee.property.name === "join" 节点。

AST 还原后 Python 复现失败?大概率漏了隐式类型转换

JS 里 "1" + 2 是字符串拼接,Python 里会报错;!![] 在 JS 是 True,但 AST 解析时可能被当成布尔字面量或忽略。这类细节不会出现在 AST 节点里,但直接影响加密结果。

最容易被忽略的是:

  • + 运算符的多义性:数值相加 vs 字符串拼接 → Python 复现时得手动判断操作数类型
  • ===== 的隐式转换差异 → JS 中 "0" == false 为真,Python 里不能直接用 == 模拟
  • 数字字面量的进制:JS 支持 0x1f(十六进制)、0o755(八进制),AST 中 Literal.value 是解析后的十进制数,但原始写法可能影响调试理解

所以 AST 还原出来的“伪代码”,只是逻辑骨架;填上类型判断和 JS 特有行为,才是能跑通的 Python 实现。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python js 前端

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2063

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4403

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5510

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

4978

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

703

5

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

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

2023.07.20

1551

4

python能做什么
python能做什么

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

2023.07.25

3704

7

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

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

2023.07.31

1569

3

python教程
python教程

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

2023.08.03

21137

23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程