0元购买某游戏648元点券
字数 1705 2025-08-07 08:21:50
某游戏0元购买648元点券漏洞分析与利用教程
1. 漏洞背景
本教程将详细分析某游戏存在的支付漏洞,该漏洞允许玩家通过特定修改实现0元购买价值648元的游戏点券。本教程仅供学习安全技术使用,请勿用于非法用途。
2. 准备工作
2.1 所需工具
- Android Device Monitor - 用于监控程序日志和方法调用
- Android Killer - APK反编译工具
- jadx-gui - 将smali代码反编译为更易读的Java代码
- APK签名工具 - 用于回编译后重新签名APK
2.2 目标分析
目标游戏使用4399支付SDK进行点券购买,支付流程中存在逻辑验证漏洞。
3. 漏洞分析流程
3.1 日志信息收集
- 使用Android Device Monitor监控游戏支付流程的日志输出
- 重点关注以下关键日志信息:
"取消支付操作"- 支付取消时的提示"4399充值返回:6001"- 支付失败返回码"4399充值返回:9000"- 支付成功返回码
3.2 代码定位
- 将"4399充值返回:"转换为Unicode格式(
\u3433\u3939\u5145\u5032\u8FD4\u56DE\u3A)进行搜索 - 定位到关键smali文件:
smali/com/leiting/sdk/channel/m4399/M4399SdkUser$4.smali
3.3 Java代码还原
使用jadx-gui查看对应Java代码:
private OperateCenter.OnRechargeFinishedListener mPayListener = new OperateCenter.OnRechargeFinishedListener() {
@Override
public void onRechargeFinished(boolean z, int i, String str) {
Message obtainMessage = M4399SdkUser.this.mHandler.obtainMessage();
String str2 = ConstantUtil.TAG;
BaseUtil.logDebugMsg(str2, "4399充值返回:" + i);
if (!z || i != 9000) {
Bundle bundle = new Bundle();
bundle.putString("resultMsg", str);
obtainMessage.what = 6;
obtainMessage.setData(bundle);
} else {
obtainMessage.what = 5;
}
M4399SdkUser.this.mHandler.sendMessage(obtainMessage);
}
};
3.4 支付逻辑分析
支付成功条件:
- 参数
z必须为true - 参数
i必须等于9000
否则支付失败,进入错误处理流程。
3.5 方法调用链追踪
使用Android Device Monitor的Method Profiling功能追踪调用链:
cn.m4399.recharge.ui.activity.RechargeActivity.d()cn.m4399.operate.x0$d.a()com.leiting.sdk.channel.m4399.M4399SdkUser$4.onRechargeFinished()
3.6 关键调用代码
RechargeActivity.d()的Java代码:
private void d() {
if (!b4.g() && a3.e != null) {
a3.e.a(false, 6001, PayResult.a(6001));
}
}
x0$d.a()的Java代码:
public class d implements a3.g {
d() {
}
@Override
public void a(boolean z, int i, String str) {
x0.this.e.onRechargeFinished(z, i, str);
}
}
4. 漏洞利用方法
4.1 smali代码修改
需要修改两处关键点:
- 将传入的
z参数从false改为true - 将传入的
i参数从6001改为9000
4.2 具体修改步骤
- 定位到
RechargeActivity.d()对应的smali代码 - 修改参数传递部分:
- 将
const/4 p1, 0x0改为const/4 p1, 0x1(false→true) - 将
const/16 p1, 0x2328(9000)改为const/16 p1, 0x1771(6001)
- 将
4.3 回编译与签名
- 保存修改后的smali代码
- 使用Android Killer回编译APK
- 对修改后的APK进行重新签名
5. 漏洞验证
- 安装修改后的游戏APK
- 登录游戏账号
- 进入点券购买界面
- 选择648元点券购买
- 点击返回键取消支付
- 观察点券是否成功增加
6. 漏洞原理总结
该漏洞利用了两个关键点:
- 客户端验证缺陷:支付结果仅由客户端本地验证,未与服务器进行二次确认
- 取消支付流程处理不当:取消支付时调用了与正常支付相同的回调函数,但传入了不同的参数
通过修改客户端验证逻辑,强制将取消支付的结果标记为成功,从而绕过支付验证。
7. 防御建议
- 服务器端验证:所有支付结果应由服务器验证,不可仅依赖客户端返回
- 取消支付独立处理:取消支付应使用独立的回调函数,不与成功支付共用
- 参数签名验证:支付回调参数应包含签名验证,防止篡改
- 混淆关键代码:对支付相关代码进行混淆,增加逆向分析难度
8. 法律与道德声明
本教程仅用于安全技术研究学习目的,旨在帮助开发者了解常见支付漏洞原理并提高防御能力。任何未经授权的游戏修改行为均可能违反游戏用户协议和相关法律法规,请勿用于非法用途。