最新雪王 type__1286 参数逆向分析
字数 1174 2025-08-19 12:41:18
雪王 type__1286 参数逆向分析教学文档
一、前言
本文详细分析某雪冰城小程序和App中的type_1286加密参数生成过程。该参数是领取免单券接口的重要加密参数,随着平台安全升级而新增。
二、调试环境搭建
1. APP端调试WebView
所需工具:
- XP模块或LSPosed框架
- WebView调试模块
步骤:
- 在模拟器中安装Magisk和LSPosed
- 导入WebView模块并选择目标APP
- 重启模拟器
- 在Chrome浏览器访问
chrome://inspect/#devices - 若设备未显示,多次执行
adb devices直到设备出现 - 点击"inspect"进入调试界面
2. 小程序端调试WebView
步骤:
- USB连接手机并开启调试模式
- 微信访问
http://debugxweb.qq.com/?inspector=true验证可用性 - 在微信中打开目标小程序页面
- Chrome访问
chrome://inspect/#devices(需翻墙) - 等待页面加载后点击"inspect"
三、抓包分析
进入免单界面点击领取,观察开发者工具中的网络请求,主要加密参数:
- URL中的
type_1286 - 提交内容中的
sign
四、逆向分析type_1286参数
1. 参数定位
在点击确认时观察调用堆栈,发现关键代码:
var UL = UE['Fu'](this[oA(P7.a)][-0x190d + -0x20e9 + 0x39f7])
UL = F0[oA(P7.A)](UH, UL, UV)
2. 加密流程分析
加密最终通过F6函数生成:
(g += N),
(N = F[UJ(mS.F)](F[UJ(mS.Y)](F[UJ(mS.U)](F[UJ(mS.a)](F[UJ(mS.A)](M[UJ(mS.D)](g)0xfbf + 0x9 * -0x189 + 0x16 * 0x158, m['n'new Date()[UJ(mS.o)1'),
g = E['FU']['ua'](N, !(0xbb4 + 0x1a49 * -0x1 + 0xe95)),
N = {}),
(N[M['F7'](L[UJ(mS.i)])] = g,
L[UJ(mS.y)] = (-0x2ff + 0xbe5 + -0x8e6, H['Fa'])(L[UJ(mS.y)], N),
(0x3 * 0xe5 + -0x614 + 0x1 * 0x365, H['FY'])(L))
简化后流程:
- 拼接参数:
g = L["FW"] + L["hash"] - 生成中间值:
N = (((((sig(g)0)new Date()["getTime"1') - 最终加密:
E['FU']['ua'](N, !0)
3. 关键函数分析
(1) sig函数
function sig(L) {
for (var N = 0, g = encodeURIComponent(L), B = 0; B < g["length"]; B++)
N = ((((N << 7) - N) + 398) + g["charCodeAt"](B)), N |= 0;
return N;
}
(2) ua函数
function ua(E, H) {
var W = ["3", "4", "2", "1", "0"], P = 0;
while (true) {
switch (W[P++]) {
case '0':
switch (M["length"] % 4) {
default: case 0: return M;
case 1: return (M + '===');
case 2: return (M + '==');
case 3: return (M + '=');
}
case '1':
if (H) return M;
continue;
case '2':
var M = uu(E, 6, function(L) {
return V["uGGDj"].charAt(L);
});
continue;
case '3':
var K = {};
K["uGGDj"] = "DGi0YA7BemWnQjCl4+bR3f8SKIF9tUz/xhr2oEOgPpac=61ZqwTudLkM5vHyNXsVJ";
var V = K;
continue;
case '4':
if (null === E) return '';
continue;
}
break;
}
}
(3) uu函数
// 复杂混淆代码,涉及base64编码转换
(4) 解密函数F3
F3 = function(a, A) {
a = a - (-0x256c + -0x23 * -0x67 + -0x17f3 * -0x1);
var r = U[a];
var o = U[0x1b * 0xd3 + -0x2 * -0x1189 + 0xb77 * -0x5],
n = a + o,
i = F[n];
r = i;
return r;
}
五、实现方案
1. 补环境方案
步骤:
- 搭建代理环境捕获所有环境检测
- 补全检测到的环境变量和方法
- 导出F6函数并调用
关键点:
- 需要补全约400行环境检测代码
- 主要检测
createElement及相关属性 - 最终导出加密函数并调用
2. 算法还原方案
方案一:
- 分析并还原sig函数
- 分析并还原ua函数
- 分析并还原uu函数
- 完整扣取解密函数F3
- 整合所有函数生成最终参数
方案二(针对解密函数不完整):
- 收集所有解密失败的字符串
- 创建映射表KKK
- 使用Proxy拦截解密函数调用
const kk_handler = {
apply: function(target, thisArg, argumentsList) {
let result = target(...argumentsList);
if (result === undefined && argumentsList in KKK) {
return KKK[argumentsList];
}
return result;
}
};
F3 = new Proxy(F3, kk_handler);
六、总结
-
type_1286参数生成流程:- 拼接原始参数
- 通过sig函数计算哈希
- 结合时间戳生成中间值
- 通过ua函数进行最终编码
-
逆向难点:
- 重度OB混淆
- 多层环境检测
- 动态生成的解密函数
-
解决方案选择:
- 补环境方案代码量大但直接
- 算法还原方案更简洁但需要深入分析
-
完整实现约需8000行代码(补环境)或几百行(算法还原)