app小程序攻防 | 外挂?!记一次艰难的sign绕过
字数 1789 2025-08-19 12:42:24
小程序Sign绕过实战教学:从逆向到数据篡改
0x01 前言
本教学文档基于一次真实的小程序游戏安全分析案例,详细讲解如何通过逆向工程和Sign绕过技术实现对游戏数据的篡改。案例中目标小程序存在Sign验证机制,我们将通过系统的方法突破这一安全防护。
0x02 目标发现与初步分析
目标选择标准
- 存在数据传输的游戏类小程序
- 具备Sign签名验证机制
- 无复杂混淆和加密
常见游戏篡改方法对比
| 方法 | 适用场景 | 复杂度 | 效果 |
|---|---|---|---|
| 黑服务器 | 服务端漏洞 | 高 | 全面控制 |
| 内存挂(CE/hook) | 本地客户端 | 中 | 实时修改 |
| 修改本地资源 | 无网络验证 | 低 | 静态修改 |
| 抓包破解 | 有网络通信 | 中 | 数据篡改 |
本案例选择"抓包破解"作为主要突破方向,因其:
- 针对小程序特性最为适用
- 技术难度适中
- 学习价值高
0x03 逆向工程准备
小程序反编译步骤
- 获取小程序包(.wxapkg)
- 使用反编译工具(如wxappUnpacker)
- 解包得到源代码结构
关键逆向工具
- 微信开发者工具:用于调试和查看小程序运行逻辑
- 反编译脚本:解包小程序包文件
- 代码编辑器:分析大量反编译代码(VSCode等)
代码结构分析
案例中发现:
- 存在分包结构
- 核心逻辑在分包中
- 主包主要负责初始化和基础功能
- 代码量庞大(约16万行)
0x04 Sign机制分析
Sign定位方法
- 抓包分析请求参数
- 在反编译代码中搜索关键接口名(如"uploadrecord")
- 跟踪请求参数生成逻辑
关键发现
- Sign生成依赖
wx_appid和wx_secret参数 - 这两个参数经过多层加密保护
- 不同接口可能使用不同的secret值
Sign生成函数分析
案例中Sign生成特点:
- 两层加密结构
- 与mousedown事件属性相关
- 涉及复杂的外层函数调用链
0x05 Sign绕过实战
第一次尝试:直接解密
- 提取加密函数代码
- 创建HTML测试环境尝试运行
- 遇到乱码问题
- 发现函数调用链过于复杂难以追踪
结果:失败
第二次尝试:调试输出
- 使用微信开发者工具重新编译
- 尝试恢复核心app.json(未成功)
- 选择性恢复关键JS文件
- 插入调试代码输出关键值
关键突破:
// 在关键位置插入调试输出
console.log("wx_secret:", wx_secret);
console.log("current sign:", generatedSign);
成功获取:
- uploadrecord接口的专用secret值
- 其他接口的secret值
Sign生成复现
- 分析时间戳参数sign生成逻辑
- 编写测试代码验证理解
- 确认本地生成的sign与服务端一致
- 扩展至目标接口(uploadrecord)
示例复现代码:
function generateSign(params, secret) {
// 1. 参数排序
const sortedKeys = Object.keys(params).sort();
// 2. 拼接键值对
let signStr = '';
sortedKeys.forEach(key => {
signStr += `${key}=${params[key]}&`;
});
// 3. 追加secret
signStr += `key=${secret}`;
// 4. 双重加密
const firstHash = md5(signStr);
const finalSign = sha1(firstHash);
return finalSign;
}
数据篡改实施
- 拦截正常游戏请求
- 分析请求参数结构
- 修改关键参数(金币、钻石等)
- 按照正确算法重新生成sign
- 重放修改后的请求
0x06 验证与结果
篡改前状态
- 第一关卡
- 204金币
篡改步骤
- 修改金币值为99999
- 重新计算sign
- 提交修改后的数据包
- 重新加载小程序
篡改结果
- 金币数量成功修改为指定值
- 其他资源值也可同样方式修改
- 游戏功能正常不受影响
0x07 技术总结与防御建议
攻击技术总结
-
逆向分析:
- 完整反编译获取源代码
- 关键接口和函数定位
-
调试技巧:
- 使用开发者工具调试
- 战略性地插入日志输出
- 部分代码恢复技术
-
Sign绕过:
- 参数分析和算法复现
- 不同接口的差异化处理
- 本地验证算法正确性
防御改进建议
-
强化Sign算法:
- 引入随机盐值
- 结合设备指纹
- 使用非对称加密
-
代码保护:
- 关键代码混淆
- 核心逻辑放在服务端
- 定期更新加密密钥
-
监控机制:
- 异常参数检测
- 请求频率限制
- Sign重放攻击防护
-
架构设计:
- 关键数据服务端校验
- 客户端仅作为展示层
- 重要操作二次确认
0x08 扩展思考
对抗升级
- 当遇到代码混淆时的应对策略
- RSA等非对称加密的自动化破解思路
- 如何应对动态密钥机制
自动化工具开发
- 基于Go语言的加解密工具链
- 自动化参数修改和重放工具
- 智能化的Sign算法识别系统
法律与道德
- 此类技术仅用于安全研究和授权测试
- 未经授权的游戏修改可能违反服务条款
- 尊重开发者劳动成果
本教学文档详细记录了从小程序逆向到Sign绕过的完整过程,重点突出了关键技术和突破思路,可作为移动应用安全研究的典型案例参考。