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'}"%funcif 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吧!
本文牛刀小试,更多内容我们后续再见!
Python操作AST解JS混淆相关推荐
- Python调用,爬虫JS混淆——数据加密获取步骤和方法
JS混淆 加密数据是无法通过在后台找到接口进行请求来获取数据 目标网站:https://www.endata.com.cn/BoxOffice/BO/Year/index.html 1. html中无 ...
- 利用AST对抗js混淆(一) 基础知识
准备工作: 1.网站及工具 JavaScript Obfuscator Tool 主要研究对象,主要是研究此网站的各种混淆方法及破解办法. JS NICE: Statistical renamin ...
- 利用AST对抗js混淆(三) 控制流平坦化(Control Flow Flattening)的处理
控制流平坦化 参考:https://security.tencent.com/index.php/blog/msg/112 控制流平坦化,简单来讲就是将代码块之间的关系打断,由一个分发器来控制代码块的 ...
- js系列教程7-DOM操作全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...
- js系列教程6-BOM操作全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...
- js系列教程1-数组操作全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...
- 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 写在前面 逆向目标 绕过无限 debugger Hook 参数 逆向参数 PyCharm 本地联调 完整代码 J ...
- python列表切片后得到剩余列表_python列表切片和嵌套列表取值操作详解
python列表切片和嵌套列表取值操作详解 给出列表切片的格式: [开头元素::步长] # 输出直到最后一个元素,(最后一个冒号和步长可以省略,下同) [开头元素:结尾元素(不含):步长] # 其中, ...
- Python爬虫教程-16-破解js加密实例(有道在线翻译)
python爬虫教程-16-破解js加密实例(有道在线翻译) 在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如: 加cookie,身份验证UserAgent 图形验证,还有很难破解的滑动验证 js签 ...
最新文章
- 第二组视频:MySQL复制
- windows和linux主机名,windows和linux下如何远程获取操作系统版本和主机名
- 【java】输入球的半径,求出其体积
- php+mysql防注入字符串过滤_php 防sql注入过滤代码
- tensorflow和keras的关系
- 电磁兼容性(EMC)标准EN55032IT设备要求
- python gdal 基于栅格shp文件裁剪geotif图
- winPE下安装系统ghost恢复系统图文详细教程
- .c文件如何一步步变成.exe文件
- lua 中pairs 和 ipairs差别
- UDP TCP socket EtherCAT都是什么?
- java计算机毕业设计图书馆管理系统源码+系统+mysql数据库+LW文档+部署文件
- Proteus常用元件对照表
- Oracle工具包使用规则整理
- 果汁机器人传销_自动果汁售货机怎么样 加盟靠谱吗
- 计算机化学博士点,一流大学建设高校各学科博士点一览
- 试试54款开源服务器软件
- 浙江省计算机二级考试选择判断题库,浙江省计算机等级考试二级判断题和答案...
- 分行和支行有什么区别
- 独家丨立白推出银发个护品牌,日化巨头如何抢占银发市场?
热门文章
- OA系统选型分析之致远OA与华天动力OA
- oracle policies失效,复制粘贴功能失效不能用怎么解决?复制粘贴不能用的图文处理方法...
- beego 例子_Beego中文文档PDF
- linux脚本的数据输出到excel,将CSV数据输出到EXCEL
- 解决光影精灵锁win键的问题
- Power Pivot(了解power pivot,获取数据,计算字段(度量值)和计算列,按列排序,多表模型关系创建)
- 贝叶斯软件genle教程_贝叶斯网络可视化软件GeNIe使用说明
- 记生产一次弱引用对象引起的空指针异常
- 万物互联的IoT时代,柔性电子会大行其道吗?
- 创建ODOO12演示账套