Javascript逆向:穿越前端保护机制
字数 1313 2025-08-24 07:48:23
JavaScript逆向工程:穿越前端保护机制
一、JavaScript基础与Console控制台
1. Console控制台功能
Console是JavaScript内置对象,主要用于控制台输出和调试:
// 基本输出方法(展示形态不同)
console.log('console.log'); // 普通信息
console.info('console.info'); // 信息类
console.debug('console.debug'); // 调试信息
console.warn('consolole.warn'); // 警告
console.error('console.error'); // 错误
分类建议:
- log()与info()对应info级别
- warn()对应warning级别
- error()对应error级别
- debug()对应verbose级别
2. 高级输出技巧
// 占位符使用
console.log("字符串: %s, 数字: %d, 对象: %o", "test", 42, {key: "value"});
// 添加CSS样式
console.log('%c hello word','color:blue; font-size: 21px');
// JSON模式输出
console.dir(DOM对象); // 强制以JSON格式输出
3. 调试辅助方法
// 计数功能
console.count(); // 默认输出调用次数
console.count('label'); // 带标签的计数
// 内存监控
console.memory; // 打印内存使用情况
二、JavaScript核心语法速成
1. 基本特性
- 解释型语言
- 弱类型
- 区分大小写
- 忽略换行和多余空格(分号;代表语句结束)
注意:return和表达式之间不能有换行,否则会被解析为return;
2. 变量与常量
const pi = 3.14; // 常量,不可改变
var name = 111; // 变量,无作用域限制
let name = 222; // 变量,有块级作用域
3. 类型转换与比较
"3"+4+5 = "345" // 字符串开头,全部转为字符串
3+4+"5" = "75" // 数字开头先计算,再转为字符串
123 == "123" // true (自动类型转换)
123 === "123" // false (严格比较类型和值)
4. 流程控制
// 三元运算符
条件 ? "yes" : "no";
// switch语句
switch(name){
case '1': console.log('1'); break;
case '2': console.log('2'); break;
default: console.log('no');
}
5. 对象与数组
// 对象操作
var obj = {name:'xiaochen', age:'20'};
obj.name = "abc"; // 修改属性
obj.phone = "88888888"; // 添加属性
// 数组操作
var arr = [];
arr.push("sleep"); // 末尾添加
arr.pop(); // 末尾删除
arr.reverse(); // 反转顺序
6. 函数与DOM操作
function add(a, b){
return a + b;
}
// DOM操作
document.write('123'); // 页面输出
document.location; // 当前URL
document.cookie; // 获取cookie
location.href='https://...'; // URL跳转
三、前端加密JS定位技术
1. onClick定位法
- 查找表单提交标签中的onClick属性
- 该属性值通常是加密函数
- 在控制台直接调试该函数
2. Event Listeners定位法
- F12打开开发者工具
- 使用选择箭头选择目标标签
- 查看Event Listeners面板中的click事件
注意:如果面板为空,可以尝试:
- 多次刷新页面
- 完成整个登录流程
- 将网页保存到本地(Ctrl+S)
3. 搜索定位法
- 保存页面(Ctrl+S)
- 使用文本编辑器全局搜索
- 常用搜索关键字:
- 按钮的id或class值(如#J_SubmitStatic)
- 加密参数名(如enpassword)
- 常见加密函数名(如RSAKey()、encrypt())
4. 调试法
- 在可疑方法中设置断点
- 输入账号密码并提交
- 单步执行跟踪加密过程
- 梳理加密逻辑并提取关键函数
四、实战案例解析
案例1:视频登录JS解密
参数:enpassword(加密密码)
分析步骤:
- 通过class或id定位加密函数
- 在控制台下断点调试
- 发现加密逻辑:
c.encrypt(b.val()) - 提取关键参数:
a.result.modulusa.result.publicExponent
- 定位RSAKey定义(通常在db函数中)
- 重构加密函数:
function encrypt(pwd){ // 1. 获取网页返回的modulus和publicExponent // 2. 初始化RSAKey // 3. 执行加密 return encryptedString(RSAKey, pwd); }
案例2:天下登录JS解密
参数:pwd(直接加密)
分析步骤:
- 直接定位加密函数
- 提取key_to_encode参数
- 寻找encryptedString函数实现
- 补充缺失的RSAKeyPair定义
- 重构完整加密流程:
// 1. 复制原始JS加密代码 // 2. 删除无关函数 // 3. 保留核心加密逻辑 // 4. 暴露加密接口
五、关键技巧总结
-
加密函数特征:
- 通常包含RSA、AES、DES等关键词
- 常见函数名:encrypt、encode、sign等
- 可能使用第三方加密库(如CryptoJS)
-
参数获取方式:
- 从网页源代码中提取
- 通过AJAX请求获取
- 硬编码在JS文件中
-
调试技巧:
- 使用F10(单步跳过)和F11(单步进入)
- 监控网络请求(XHR/fetch)
- 观察调用堆栈(Call Stack)
-
代码重构原则:
- 保留核心加密逻辑
- 删除无关函数和代码
- 简化参数获取方式
- 确保运行环境一致(浏览器对象等)
通过以上方法,可以有效分析前端加密逻辑,突破保护机制,为安全测试和漏洞挖掘提供支持。