调用网页JS解决前端加密
字数 996 2025-08-22 12:22:42
前端加密逆向与PyExecJS调用实战教程
前言
在渗透测试过程中,前端加密是常见的防护手段。本文详细讲解如何通过逆向分析前端JavaScript代码,并使用Python的PyExecJS库调用网页自身的JS加密函数,实现自动化处理加密请求。
一、定位关键加密函数
1. 观察请求与响应
- 通过浏览器开发者工具(F12)查看网络请求
- 关注请求参数中的加密字段和响应中的特殊字符串
2. 搜索关键字符串
- 在开发者工具的Sources面板中搜索:
- 服务ID(如
serviceid) - 具体的ID号
- 加密参数的名称
- 服务ID(如
3. 下断点跟踪
- 在疑似加密函数处设置断点
- 跟踪函数调用栈,找到核心加密函数(如示例中的
c=$(b, x.value))
4. 追踪函数来源
- 注意新声明的类(如
l5) - 检查是否从其他JS文件引入
- 注意每次刷新页面时文件名和函数名的变化
二、下载必要JS文件
- 定位到核心加密函数所在的JS文件
- 下载该文件及其所有依赖文件
- 保存时注意保持原始编码(通常为UTF-8)
三、使用PyExecJS调用JS函数
1. 安装PyExecJS
pip install PyExecJS
2. 基本调用方法
with open('your.js', 'r', encoding='utf8', errors='ignore') as f:
jscode = f.read()
ctx = execjs.compile(jscode)
result = ctx.call('your_func', '参数1', '参数2')
3. 完整请求示例
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
import execjs
import json
import requests
headers = {
'Host': 'xxxx',
'Cookie': 'xxxx',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN',
'Origin': 'xxxxx',
'Referer': 'xxxxx',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'Priority': 'u=0',
'Content-Length': '0',
'Te': 'trailers',
'Connection': 'keep-alive'
}
def encodehash(p):
navigator = """
var navigator = {
userAgent: 'Python-ExecJS',
appVersion: '1.0',
};
"""
window = """
var window = {};
window.document = {};
"""
with open('tree-BbjKWDWs.js', 'r', encoding='utf8', errors='ignore') as f:
jscode = f.read()
ctx = execjs.compile(window + '\n' + navigator + '\n' + jscode)
result = ctx.call('re', json.dumps(p), '密钥')
return result
url = 'https://xxx' # 100012接口
for i in range(0, 9):
user = 'xxxxx' + str(i)
p1 = {
"identityMethod": ["Mobile Number", "Email"],
"identityType": "xx",
"account": user
}
data = {
"param": encodehash(p1),
"serviceId": "100012"
}
res = requests.post(url, json=data, headers=headers)
print(res.json())
四、常见问题解决
1. GBK编码错误
报错信息:UnicodeEncodeError: 'gbk' codec can't encode character
解决方案:
在脚本开头添加:
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
2. ES6模块导入导出问题
PyExecJS不支持ES6的import/export语法,需要转换为CommonJS格式:
原始ES6代码:
// 导出
export { Jt as K, $t as a, Xt as h };
// 导入
import { K as x, a as K, h as q } from "./module.js";
修改为CommonJS:
// 导出
module.exports = { K: Jt, a: $t, h: Xt };
// 导入
const { K: x, a: K, h: q } = require('./module.js');
五、关键注意事项
- 环境模拟:JS代码可能依赖浏览器环境(如
window、navigator对象),需要手动模拟 - 编码问题:确保JS文件以UTF-8编码读取和写入
- 动态变化:注意文件名和函数名可能随页面刷新而变化
- 依赖完整:确保下载所有必要的依赖JS文件
- 错误处理:添加适当的异常捕获和处理机制
六、总结
通过本文介绍的方法,可以有效地逆向分析前端加密逻辑,并利用PyExecJS实现自动化加密请求的构造和发送。关键在于:
- 准确找到核心加密函数
- 正确处理JS环境依赖
- 解决编码和模块语法兼容性问题
- 完整模拟浏览器端的加密流程
这种方法避免了复杂的逆向分析过程,直接利用网站自身的加密代码,大大提高了效率和准确性。