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定位法

  1. F12打开开发者工具
  2. 使用选择箭头选择目标标签
  3. 查看Event Listeners面板中的click事件

注意:如果面板为空,可以尝试:

  • 多次刷新页面
  • 完成整个登录流程
  • 将网页保存到本地(Ctrl+S)

3. 搜索定位法

  1. 保存页面(Ctrl+S)
  2. 使用文本编辑器全局搜索
  3. 常用搜索关键字:
    • 按钮的id或class值(如#J_SubmitStatic)
    • 加密参数名(如enpassword)
    • 常见加密函数名(如RSAKey()、encrypt())

4. 调试法

  1. 在可疑方法中设置断点
  2. 输入账号密码并提交
  3. 单步执行跟踪加密过程
  4. 梳理加密逻辑并提取关键函数

四、实战案例解析

案例1:视频登录JS解密

参数:enpassword(加密密码)

分析步骤

  1. 通过class或id定位加密函数
  2. 在控制台下断点调试
  3. 发现加密逻辑:c.encrypt(b.val())
  4. 提取关键参数:
    • a.result.modulus
    • a.result.publicExponent
  5. 定位RSAKey定义(通常在db函数中)
  6. 重构加密函数:
    function encrypt(pwd){
        // 1. 获取网页返回的modulus和publicExponent
        // 2. 初始化RSAKey
        // 3. 执行加密
        return encryptedString(RSAKey, pwd);
    }
    

案例2:天下登录JS解密

参数:pwd(直接加密)

分析步骤

  1. 直接定位加密函数
  2. 提取key_to_encode参数
  3. 寻找encryptedString函数实现
  4. 补充缺失的RSAKeyPair定义
  5. 重构完整加密流程:
    // 1. 复制原始JS加密代码
    // 2. 删除无关函数
    // 3. 保留核心加密逻辑
    // 4. 暴露加密接口
    

五、关键技巧总结

  1. 加密函数特征

    • 通常包含RSA、AES、DES等关键词
    • 常见函数名:encrypt、encode、sign等
    • 可能使用第三方加密库(如CryptoJS)
  2. 参数获取方式

    • 从网页源代码中提取
    • 通过AJAX请求获取
    • 硬编码在JS文件中
  3. 调试技巧

    • 使用F10(单步跳过)和F11(单步进入)
    • 监控网络请求(XHR/fetch)
    • 观察调用堆栈(Call Stack)
  4. 代码重构原则

    • 保留核心加密逻辑
    • 删除无关函数和代码
    • 简化参数获取方式
    • 确保运行环境一致(浏览器对象等)

通过以上方法,可以有效分析前端加密逻辑,突破保护机制,为安全测试和漏洞挖掘提供支持。

JavaScript逆向工程:穿越前端保护机制 一、JavaScript基础与Console控制台 1. Console控制台功能 Console是JavaScript内置对象,主要用于控制台输出和调试: 分类建议 : log()与info()对应info级别 warn()对应warning级别 error()对应error级别 debug()对应verbose级别 2. 高级输出技巧 3. 调试辅助方法 二、JavaScript核心语法速成 1. 基本特性 解释型语言 弱类型 区分大小写 忽略换行和多余空格(分号;代表语句结束) 注意 :return和表达式之间不能有换行,否则会被解析为 return; 2. 变量与常量 3. 类型转换与比较 4. 流程控制 5. 对象与数组 6. 函数与DOM操作 三、前端加密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.modulus a.result.publicExponent 定位RSAKey定义(通常在db函数中) 重构加密函数: 案例2:天下登录JS解密 参数 :pwd(直接加密) 分析步骤 : 直接定位加密函数 提取key_ to_ encode参数 寻找encryptedString函数实现 补充缺失的RSAKeyPair定义 重构完整加密流程: 五、关键技巧总结 加密函数特征 : 通常包含RSA、AES、DES等关键词 常见函数名:encrypt、encode、sign等 可能使用第三方加密库(如CryptoJS) 参数获取方式 : 从网页源代码中提取 通过AJAX请求获取 硬编码在JS文件中 调试技巧 : 使用F10(单步跳过)和F11(单步进入) 监控网络请求(XHR/fetch) 观察调用堆栈(Call Stack) 代码重构原则 : 保留核心加密逻辑 删除无关函数和代码 简化参数获取方式 确保运行环境一致(浏览器对象等) 通过以上方法,可以有效分析前端加密逻辑,突破保护机制,为安全测试和漏洞挖掘提供支持。