Python操作AST解JS混淆

通过生成语法树(AST),可快速修改代码中的一些混淆处理,从而简化代码,便于后续分析。

本文通过Python来把JS转为AST并进行简单的操作,内容很简单。

比如我们下图中的JS代码,有sum和minus两个函数,一个变量a,两个换行\n,以及一次sum函数的调用,参数为1和2。

在这里插入图片描述

通过pyjsparser库将script代码转换成为json-ast格式。

pyjsparser是目前用于 python 的相对便捷和易理解的 JavaScript 解析器。可将JavaScript翻译成Python,即在Python中运行JavaScript代码。

import pyjsparser
js_ast = pyjsparser.parse(script)

转换后用Json格式化工具打开。

在这里插入图片描述
在body下的元素有这几种类型:

    函数声明:FunctionDeclaration

      空语句(\n):EmptyStatement

      变量声明:VariableDeclaration

      表达式语句:ExpressionStatement

根据Json可看到FunctionDeclaration中有基本的函数名、参数名、参数类型、块语句和返回语句等。

此外,表达式语句中还有调用表达式(CallExpression)、二元表达式(BinaryExpression)、赋值表达式(AssignmentExpression)等等。

那么我们就可以通过这些Type,以修改Json对象的方式去操作这棵语法树。比如根据是否被调用去删除一些无用的对象,删除未调用的函数,或根据规则去替换一些结构,修改一些节点。

接下来看这段代码
在这里插入图片描述
假如这是一段时间长并且难以阅读的代码,我们需要先将其转为AST,然后遍历所有函数,来查找未被调用的方法,然后进行删除,再根据AST转回正常的JS代码。

# 完整代码如下,大家自己试试删除无用变量a吧!
# js2py依赖于pyjsparser,所以安装js2py即可安装pyjsparser
# pip install js2py
script = '''
    function sum(a,b){  
        c = minus(2,3)
        return a+c;
    };

    function minus(a2,b2){  
        return a2-b2;
    };

    function dddd(a2,b2){  
        return a2-b2;
    };

    var a = 123;
    sum(1,2)
'''

import pyjsparser
js_ast = pyjsparser.parse(script)
# 获取所有方法
funcList = []
for i in js_ast['body']:
    if i['type'] =='FunctionDeclaration':
        name = i['id']['name']
        funcList.append(name)

# 查找未被调用的方法
noCallList = []
for func in funcList:
    searchStatement = "{'type': 'CallExpression', 'callee': {'type': 'Identifier', 'name': '%s'}"%func
    if searchStatement not in str(js_ast):
        noCallList.append(func)

# 删除未调用的方法
for i in js_ast['body']:
    if i['type'] =='FunctionDeclaration':
        if i['id']['name'] in noCallList:
            js_ast['body'].remove(i)

#js_ast['body'][0]['id']['name'] = 'pythonlx'  # 修改一个函数名

# 用AST重新生成js代码
import js2py.py_node_modules.escodegen as escodegen
escodegen = escodegen.var.get('escodegen')
res = escodegen.get('generate')(js_ast)
print(res.to_python()

执行后,可以发现未被调用的dddd方法已经被删除。

代码很简单,大家试试如何删除无关变量a吧!

本文牛刀小试,更多内容我们后续再见!在这里插入图片描述

<think>好的,我需要帮助用户决如何还原JavaScript混淆代码的问题。首先,我要理用户的需求,他们可能遇到了被混淆JS代码,想要进行逆向工程或分析,所以需要还原的方法或工具。 根据用户提供的三个引用内容,我需要从中提取有用的信息。引用[1]提到有反混淆工具可以将混淆过的代码还原,并提到一些工具如UglifyJSjsbeautify。引用[2]讨论了常见的混淆方式,比如变量名替换、控制流扁平化、字符串加密等,并提到使用AST进行还原。引用[3]给出了一个例子,使用UglifyJS处理后的代码通过jsbeautify美化后的结果。 接下来,我需要整理出还原混淆代码的具体步骤和工具。首先,用户需要识别混淆类型,比如变量名替换或控制流扁平化。然后,使用工具如jsbeautify进行格式化,提高可读性。对于字符串加密,可能需要动态执行或静态分析来密。AST操作工具如Babel或esprima可以帮助析和修改代码结构。反混淆工具如JStillery或de4js可以在线处理。动态调试则可以通过浏览器开发者工具跟踪执行过程。 然后,需要列举常用的工具,如在线工具de4jsJStillery,本地工具如Babel、eslint,以及浏览器开发者工具。还要提到AST在还原中的作用,比如析代码为AST后进行修改再生成代码。 注意事项方面,用户可能需要面对无法完全还原的情况,特别是使用了多层混淆或虚拟化技术的情况。同时,法律问题需要注意,确保有权进行反混淆。 最后,生成相关问题,涵盖混淆技术类型、AST的应用、动态调试的优势、无法还原的情况和法律风险。 整个过程中,要确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但这里可能不太需要数学公式,所以可能用不到。不过需要检查是否有变量或技术术语需要特别标注。例如,AST(抽象语法树)可能需要用中文全称加括号注明英文缩写。 需要确保回答结构清晰,分步骤说明,引用正确的来源,并在末尾添加相关问题。同时,使用中文,避免使用Markdown格式,保持自然的口语化表达,但不过于随意。</think>### JavaScript混淆代码还原方法及工具指南 #### 一、混淆代码的常见类型 1. **变量/函数名替换** 将原名称替换为短随机字符,例如:`var a=function(){...}`。这类混淆可通过抽象语法树(AST析还原[^2]。 2. **控制流扁平化** 将代码逻辑拆分为多个无序块,通过`switch`或`while`跳转执行。需通过AST分析控制流并重组代码。 3. **字符串加密** 使用`eval`或`Function`执行加密后的字符串,例如: ```javascript eval(atob("ZG9jdW1lbnQud3JpdGUoJ0hlbGxvJyk=")); // 码后为document.write('Hello') ``` 需动态调试或静态分析提取加密内容。 --- #### 二、还原步骤与工具推荐 1. **步骤1:代码格式化** 使用工具如`js-beautify`提升可读性: ```bash npm install js-beautify -g js-beautify input.js > output.js ``` 2. **步骤2:AST操作还原** - **工具选择** - Babel:析代码为AST后修改节点 - ESLint:检测并修复代码结构 - **示例操作** 还原变量名替换的AST处理流程: $$ \text{混淆代码} \xrightarrow{\text{析}} \text{AST} \xrightarrow{\text{重命名}} \text{可读代码} $$ 3. **步骤3:反混淆工具** - **在线工具** - [de4js](https://lelinhtinh.github.io/de4js/):支持控制流反扁平化 - [JStillery](https://github.com/mindedsecurity/jstillery):处理字符串加密 - **本地工具** - UglifyJS:逆向处理压缩后的代码(示例见引用[3]) 4. **步骤4:动态调试** 使用浏览器开发者工具的**Sources**面板,逐步执行代码并观察变量值变化[^1]。 --- #### 三、注意事项 1. **不可逆情况** 若混淆使用**代码虚拟化**(如将JS转换为自定义字节码),通常无法完全还原。 2. **法律风险** 反混淆需遵守代码版权协议,避免侵权行为[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考古学家lx(李玺)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值