js逆向-你要学会偷懒「使用工具」
字数 1105 2025-08-22 12:22:30
JS逆向实战教学:使用工具提高效率
一、准备工作
网站运行时间轴
- URL加载
- 加载HTML
- 加载JS
- 运行JS初始化
- 用户触发事件
- 调用特定JS代码
- 明文数据处理
- 加密函数处理
- 发送加密数据(XHR-SEND)
- 接收服务器响应
- 解密函数处理
- 刷新网页渲染
浏览器调试功能
- Chrome高阶调试指南:知乎文章
二、快速定位加解密函数
搜索关键字
- 登陆时的URI
- passwd
- Encrypt/Decrypt
- 其他相关加密术语
实用脚本
- HookScript.js:GitHub链接
- 提供常用断点
- 禁用无限debugger
三、利用加解密函数的三种方式
- 复原原加密逻辑:直接分析并重现加密过程
- 抠出原有JS:提取网站原有加密函数直接使用
- RPC主动调用:通过远程调用网站已有的加密函数
四、实用工具介绍
1. HookScript.js
// ==UserScript==
// @name 「Hook Script」fuck断点
// @description 一些用于hook的常用断点,禁用无限debug
// 功能:
// 1. JSON.parse调用断点
// 2. 设置document.cookie时断点
// 3. 调用XMLHttpRequest时断点
// 4. 发送POST请求时断点
2. NoDebugger.js
// ==UserScript==
// @name 代码中禁用无限Debugger
// @description 禁用无限Debugger
// 主要功能:绕过网站的反调试机制
3. jsrpc.js
// ==UserScript==
// @name jsrpc模版
// @description 加解密jsrpc自动化脚本
// 配合Sekiro、Mitmproxy使用
// 主要功能:
// 1. 加密接口
// 2. 解密接口
五、实战演示
示例1:寻找加密位置
- 使用HookScript.js脚本
- 选择方式4:"相同密码多次重复登陆但其值不一样可判断其加盐了"
- 点击堆栈nfn下断点
- 逐步调试获得加密位置
示例2:jsrpc主动调用
- 启动Sekiro服务
- Windows:
bin/sekiro.bat - Linux:
bin/sekiro.sh - Mac:
bin/sekiro
- Windows:
- 浏览器加载jsrpc.js油猴脚本
- 测试接口:
- 加密:
http://127.0.0.1:5612/business-demo/invoke?group=test_cha11&action=encrypt&data= - 解密:
http://127.0.0.1:5612/business-demo/invoke?group=test_cha11&action=decode&data=
- 加密:
登陆暴力破解实战
- 配置Sekiro
- 加载油猴脚本
- 使用Yakit进行暴力破解
- 请求包配置:
- 请求包1:配置基本参数
- 请求包2:配置暴力破解参数
- 开始执行暴力破解
六、关键代码片段
Sekiro客户端实现
function SekiroClient(wsURL){
this.wsURL = wsURL;
this.handlers = {};
this.socket = {};
this.webSocketFactory = this.resolveWebSocketFactory();
this.connect();
}
// 注册加密解密接口
var client = new SekiroClient("ws://127.0.0.1:5612/business-demo/register?group=test_cha11&clientId="+Math.random());
client.registerAction("encrypt", function(request, resolve, reject){
var data = request['data'];
var cha = window._v(data);
resolve(cha);
});
client.registerAction("decode", function(request, resolve, reject){
var data = request['data'];
var chaa = window._h(data);
resolve(chaa);
});
禁用无限Debugger
// 破解无限Debugger
var constructorHook = constructor;
Function.prototype.constructor = function(s){
if(s == "debugger"){
return function(){}
}
return constructorHook(s);
}
七、项目地址
八、注意事项
- 使用前需要将加密函数设置为全局函数,例如:
if (!window._h){window._h = h} - 确保Sekiro服务正常运行
- 暴力破解需遵守法律法规,仅在授权测试中使用
- 油猴脚本需要根据实际域名修改@match规则
通过这套工具和方法论,可以大大提高JS逆向分析的效率,特别是在处理加密算法和反调试机制时。