Sekiro+Yakit 热加载无痛绕sign
字数 1363 2025-08-22 12:23:06
Sekiro与Yakit热加载无痛绕Sign技术详解
1. 背景与问题概述
在Web安全与逆向工程中,经常会遇到需要绕过签名验证(sign)的场景。传统方法需要完整分析加密算法并还原加密链,但面临以下挑战:
- 多层加密或自研算法
- 代码混淆严重
- 算法复杂度高
- 存在反调试机制(如无限debugger)
本文介绍基于Sekiro框架和Yakit热加载技术的无痛绕签方案,无需完全理解算法细节即可实现签名绕过。
2. 技术原理
2.1 JSRPC技术
JSRPC(JavaScript Remote Procedure Call)是一种远程调用JavaScript函数的技术,其工作原理:
- 在客户端(浏览器)注入JSRPC环境
- 建立与JSRPC服务器的WebSocket连接
- 注册需要调用的加解密函数
- 服务器通过WebSocket发送调用请求
- 客户端执行函数并返回结果
2.2 Sekiro框架
Sekiro是基于JSRPC的封装框架,主要特点:
- 提供稳定的WebSocket通信通道
- 简化函数注册和调用流程
- 支持多语言客户端调用
- 内置负载均衡和故障转移
3. 实战演示:绕过签名验证
3.1 目标分析
目标场景:实名认证接口
- 无频率限制但存在签名验证
- 关键参数:APP_TIME、APP_LICENSE_ID
- 签名函数:dd()
- 签名生成逻辑:
sign=dd(l + cl + r + s, r)- l = APP_TIME
- cl = APP_LICENSE_ID
- r = appKey
- s = URL编码后的姓名和身份证号
3.2 反调试绕过
目标网站设置了无限debugger反调试,绕过方法:
var _constructor = constructor;
Function.prototype.constructor = function (s) {
if (s == "debugger"){
console.log(s)
return null;
}
return _constructor(s)
}
配合Chrome开发者工具的"一律不在此处暂停"选项,可有效绕过。
3.3 签名函数定位
- 通过删减参数法确定影响签名的参数
- 在JS代码中搜索关键参数(APP_TIME、APP_LICENSE_ID)
- 定位到签名函数dd()
- 通过断点调试确认函数调用逻辑
3.4 Sekiro环境搭建
- 下载并启动Sekiro服务端(默认端口5612)
- 在浏览器控制台注入以下代码(需修改4处关键点):
// 修改1: WebSocket地址改为本地
// 修改2: 自定义group名称
// 修改3: 自定义action名称
// 修改4: 实际业务逻辑
(function(){
var client = new SekiroClient("ws://127.0.0.1:5612/business/register?group=wsyu9a&clientId="+Math.random().toString(36).substr(2));
client.registerAction("signDecrypt",function(request, resolve, reject){
// 这里实现签名生成逻辑
var result = dd(request['data1'], request['data2']);
resolve(result);
})
})()
- 将目标签名函数(dd)作用域提升至全局
3.5 Python客户端调用
import requests
data = {
"group": "wsyu9a", # 与注册时一致
"action": "signDecrypt", # 与注册时一致
"data1": "参数1", # 对应dd函数第一个参数
"data2": "参数2" # 对应dd函数第二个参数
}
res = requests.get("http://127.0.0.1:5612/business/invoke", params=data)
print(res.text)
3.6 Yakit热加载实现
在Yakit中创建热加载脚本:
signDecryot = func(sfz) {
APP_TIME = '1735326352548'
APP_LICENSE_ID = '1730789038315978754'
appKey = '9b5a1fa345624fdf937312eb93aabe4e'
s=codec.EscapeQueryUrl('张三')+'&'+sfz+'&'
data1=APP_TIME+APP_LICENSE_ID+appKey+codec.EncodeUrl(s)
data2=appKey
rsp = http.Get(f"http://127.0.0.1:5612/business/invoke?group=wsyu9a111&action=signDecrypt&data1=${data1}&data2=${data2}")
return json.Find(rsp.Data(), "$.data")
}
4. 技术优势
- 无需逆向算法:直接调用目标网站的JS函数,无需理解内部实现
- 实时生效:修改后立即生效,无需重启或重新部署
- 跨语言调用:任何语言都可以通过HTTP/WebSocket调用JS函数
- 批量处理:可轻松实现批量自动化操作
- 动态调试:结合浏览器调试工具,方便验证和调整
5. 注意事项
- 确保目标函数已提升至全局作用域
- 保持Sekiro服务端稳定运行
- 注意WebSocket连接的安全性(生产环境建议使用wss)
- 对于频繁变更的签名算法,需要及时更新注册的函数
- 合理设置超时和重试机制,避免因网络问题导致失败
6. 参考资源
- Sekiro官方文档: https://sekiro.iinti.cn/sekiro-doc/
- 双层mitmproxy代理实现自动化加解密
- JSRPC技术原理详解
通过这套方案,安全研究人员可以高效绕过复杂的签名验证机制,专注于核心业务逻辑的分析和测试。