JS逆向,前端加密暴力破解(小白无痛学习)
字数 1268 2025-08-20 18:18:23
JS逆向与前端加密暴力破解实战教程
一、无限debugger破解方法
1. 认识无限debugger
无限debugger是网站反调试的常见手段,通常通过debugger语句或Function("debugger").call()等方式实现,导致调试器不断暂停执行。
2. 破解方法
(1) 条件断点法
- 在Chrome开发者工具中,找到触发debugger的代码行
- 右键选择"Add conditional breakpoint"
- 输入条件
false,这样断点永远不会触发
(2) 函数重写法
// 重写Function构造函数
Function.prototype.constructor = function() {
return function(){};
};
// 或者直接禁用debugger
var _constructor = Function.prototype.constructor;
Function.prototype.constructor = function() {
if(arguments[0] === "debugger") {
return function(){};
}
return _constructor.apply(this, arguments);
};
(3) 禁用所有断点
- 在Chrome开发者工具的"Sources"面板
- 点击右上角的"Deactivate breakpoints"图标(六边形带暂停符号)
(4) 使用Never Pause Here功能
- 在触发debugger的行上右键
- 选择"Never pause here"
(5) 修改浏览器核心
- 对于顽固的VM18XX环境,可能需要修改浏览器核心代码
- 示例代码:
// 在控制台执行
let oldFunction = Function.prototype.constructor;
Function.prototype.constructor = function(a) {
if(a == "debugger") {
console.log("debugger blocked");
return function(){};
}
return oldFunction(a);
};
二、加速乐/BAT反爬破解
1. 加速乐原理分析
加速乐通过以下方式实现防护:
- 动态cookie生成(如
__jsl_clearance_s) - 浏览器指纹检测
- 行为验证
- 代码混淆
2. 破解步骤
(1) 获取动态cookie
// 示例:解析加速乐cookie生成逻辑
function getCookie() {
// 通常包含以下步骤:
// 1. 获取初始cookie
// 2. 解析服务器返回的JS挑战
// 3. 执行数学运算生成最终cookie
// 4. 设置cookie并重定向
return calculatedCookie;
}
(2) 绕过浏览器指纹检测
// 覆盖常见指纹检测点
Object.defineProperty(navigator, 'webdriver', {
get: () => false
});
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3],
});
Object.defineProperty(navigator, 'languages', {
get: () => ['zh-CN', 'zh'],
});
(3) 处理代码混淆
- 使用AST工具解析混淆代码
- 关键点:
- 识别字符串加密
- 还原控制流平坦化
- 重建函数调用关系
3. 完整破解流程
- 首次请求获取JS挑战
import requests
first_response = requests.get("https://target.com")
jsl_script = extract_jsl_script(first_response.text) # 提取JS挑战代码
- 解析并执行JS代码
import execjs
ctx = execjs.compile(jsl_script)
cookie_value = ctx.call("generateCookie") # 调用生成cookie的函数
- 携带cookie发起正式请求
cookies = {"__jsl_clearance_s": cookie_value}
final_response = requests.get("https://target.com", cookies=cookies)
三、前端加密分析与暴力破解
1. 常见加密方式
- RSA/AES对称加密
- 自定义加密算法
- 哈希运算(MD5, SHA等)
- 数据编码(Base64, Hex等)
2. 加密定位方法
(1) 搜索关键函数
- 在开发者工具中搜索:
encryptdecryptsignkeyAESRSA
(2) XHR断点
- 在"Sources"面板添加XHR断点
- 拦截所有包含特定字符串的请求
(3) 堆栈追踪
- 在加密参数位置下断点
- 查看调用堆栈(Call Stack)定位加密函数
3. 暴力破解示例
(1) 简单加密破解
// 假设发现如下加密函数
function encrypt(input) {
var result = "";
for(var i = 0; i < input.length; i++) {
result += String.fromCharCode(input.charCodeAt(i) + 1);
}
return result;
}
// 暴力破解解密函数
function decrypt(encrypted) {
var result = "";
for(var i = 0; i < encrypted.length; i++) {
result += String.fromCharCode(encrypted.charCodeAt(i) - 1);
}
return result;
}
(2) 复杂加密破解流程
- 定位加密函数
- 提取加密算法
- 分析密钥生成方式
- 模拟加密过程或直接调用加密函数
- 构建自动化破解工具
四、实战技巧与工具
1. 常用工具
- Chrome开发者工具
- Fiddler/Charles抓包工具
- AST解析工具(Babel, Esprima)
- Python execjs库
- Node.js调试环境
2. 高级技巧
- Hook关键函数:
// Hook加密函数示例
let oldEncrypt = window.encrypt;
window.encrypt = function(data) {
console.log("加密输入:", data);
let result = oldEncrypt(data);
console.log("加密结果:", result);
return result;
};
- 环境模拟:
// 模拟浏览器环境
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html>`);
window = dom.window;
document = window.document;
- 自动化处理:
# Python自动化示例
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.get("https://target.com")
# 执行JS代码破解加密
result = driver.execute_script("return encrypt('test');")
五、注意事项
- 遵守法律法规,仅用于授权测试
- 复杂加密可能需要动态分析结合静态分析
- 注意网站更新频率,加密方式可能经常变化
- 处理反调试时要考虑性能影响
- 真实环境中可能需要组合多种破解方法
通过以上方法,可以系统性地分析和破解前端加密及反调试机制。实际应用中需要根据具体场景灵活组合这些技术。