对某登录站点的JS前端逆向思路
字数 1295 2025-08-10 08:28:13
JS前端逆向分析实战教程
一、JS逆向基础概念
JS逆向是指通过分析JavaScript代码,理解其加密、验证等逻辑的过程。主要应用场景包括:
- 登录表单加密分析
- API请求签名破解
- 数据加密/解密流程还原
二、JS代码定位方法
1. 元素审查定位法
- 打开浏览器开发者工具(F12)
- 选择目标元素(如登录按钮)
- 查看"事件监听器"选项卡
- 定位相关JS文件(如login.js)
2. 全局搜索法
- 打开开发者工具
- 使用Ctrl+Shift+F进行全局搜索
- 搜索关键词如:
- password
- Crypto
- encrypt/decrypt
- secret/key/iv等加密相关术语
3. Onclick属性定位法
- 检查HTML元素的onclick属性
- 若属性值为JS函数,则可能是加密入口
- 追踪该函数定义位置
三、实战案例1:登录表单AES加密分析
1. 加密流程分析
function check() {
var code = 'letu@levle'; // 加密密钥来源
var ypassword = $("#ypassword").val();
var newPassword = secret(ypassword, code, false); // 加密函数调用
$("#xpassword").val(newPassword);
}
2. AES加密参数提取
通过调试发现:
- Key:
code.substring(16)→f3991777154f4bd0 - IV:
code.substring(0,16)→ace43e65106a77f6 - 加密模式: CBC
- 填充方式: Pkcs7
3. Python实现AES加密
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
key = 'f3991777154f4bd0'
iv = 'ace43e65106a77f6'
def AES_Encrypt(data):
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
paddingdata = pad(data.encode('utf-8'), AES.block_size)
encrypted = cipher.encrypt(paddingdata)
return base64.b64encode(encrypted).decode()
四、实战案例2:API请求签名分析
1. 签名生成流程
const u = "fanyideskweb" // client
const d = "webfanyi" // product
function k(e, t) {
return j(`client=${u}&mysticTime=${e}&product=${d}&key=${t}`)
}
function j(e) {
return c.a.createHash("md5").update(e.toString()).digest("hex")
}
function E(e, t) {
const o = (new Date).getTime(); // 时间戳
return {
sign: k(o, e), // 签名
mysticTime: o, // 时间戳
// 其他固定参数...
}
}
2. 签名生成关键点
- 固定参数:
- client: "fanyideskweb"
- product: "webfanyi"
- key: "fsdsogkndfokasodnaso" (通过调试发现)
- 动态参数:
- mysticTime: 当前时间戳
- 组合格式:
client=${client}&mysticTime=${time}&product=${product}&key=${key} - MD5哈希生成签名
3. Python实现请求签名
import hashlib
import time
localtime = str(int(time.time() * 1000))
canshu = f"client=fanyideskweb&mysticTime={localtime}&product=webfanyi&key=fsdsogkndfokasodnaso"
sign = hashlib.md5(canshu.encode(encoding='utf8')).hexdigest()
五、调试技巧
-
断点设置:
- 在可疑函数调用处设置断点
- 在加密函数入口设置断点
- 在参数生成位置设置断点
-
变量监控:
- 观察关键变量的值变化
- 追踪参数传递路径
-
调用堆栈分析:
- 查看函数调用关系
- 逆向追踪加密流程
六、常见加密算法识别
-
AES加密特征:
- 出现key/iv参数
- 有CBC/ECB等模式设置
- 有Pkcs7等填充方式
-
RSA加密特征:
- 出现公钥/私钥
- 有setPublicKey等调用
- 使用长字符串密钥
-
MD5/SHA哈希特征:
- createHash方法调用
- digest('hex')输出
- 固定长度输出(32/64字符)
七、防御措施与注意事项
-
防御措施:
- 代码混淆(如变量名混淆)
- 加密逻辑分散
- 动态密钥生成
- 反调试机制
-
注意事项:
- 仅用于学习研究
- 遵守网站使用条款
- 避免高频请求
- 尊重版权和隐私
八、完整工作流程总结
- 定位加密入口点(全局搜索/事件监听)
- 分析加密函数调用链
- 提取关键加密参数(key/iv/salt等)
- 确定加密算法和模式
- 验证加密结果
- 编写对应解密/加密代码
- 集成到自动化工具中
通过以上方法,可以系统性地分析和逆向大多数前端JS加密逻辑。实际应用中需要根据具体情况灵活调整分析方法。