一、目的
修改游戏中元宝充值订单金额,如下图将3000元订单改为一元
二、思路与实践
首先我们先了解一下微信和支付宝在app中的调用流程(图片来源网络,侵删):
上图中可以看到, 商户app请求订单 -> 商户Server返回支付参数 -> 商户app调起第三方支付。(微信,支付宝同理)
那么我们是否可以在app调起第三方支付时将商户Server返回的参数中的订单金额修改掉。
上一篇中我们已经解密了传奇手游的lua脚本代码,这里不在赘述。
在手游脚本中搜索“支付”关键字,有很多脚本,最后我们锁定“CallFCommand.lua”
第一次尝试时,找错了代码,所以没有成功,这个文章后面我会讲。我们先讲成功修改的方法。
锁定代码:
local jData = {}
jData.productPrice = tostring( price )
jData.productId = tostring( requestID )
jData.productName = tostring( name )
jData.productCoin = tostring( game_coin )
jData.roleName = propertyProxy:GetName()
jData.roleId = loginProxy:GetSelectedRoleID()
jData.serverId = loginProxy:GetSelectedServerId()
jData.serverName = loginProxy:GetSelectedServerName()
jData.userId = tostring( AuthProxy:GetUsername() )
jData.srvDomain = tostring( loginProxy:GetSelectedServerDomain() )
jData.ext = string.format("%s|%s|%s", serverip, platform, jsonData.order_no)
jData.order_no = jsonData.order_no
jData.roleCreate = tostring( loginProxy:GetSelectedRoleCTime() ) -- 创建时间
jData.rolePower = tostring( propertyProxy:GetMainPlayerPower() ) -- 战力
jData.roleJob = tostring( GetJobName(propertyProxy:GetRoleJob()) ) -- 职业 战/法/道
jData.roleSex = tostring( propertyProxy:GetRoleSex() + 1 ) -- 性别 1男 2女
jData.vipLevel = tostring( 0 ) -- vip等级
jData.roleVIPLev = tostring( 0 ) -- vip等级
jData.roleLevel = tostring( propertyProxy:GetRoleLevel() ) -- 角色等级
jData.roleBalance = tostring( MoneyProxy:GetMoneyCountById(4, true, true) ) -- 当前元宝数量
dump(jData)
-- on call of father
global.L_NativeBridgeManager:GN_onCallOF(jData)
观察代码,price变量在其他位置的代码注释中标注为付款金额(元),我们猜测这里有可能是商户server返回的订单信息,并且方法结尾有一个Native层的方法调用。
我们先输出一下price
release_print("test测试".. tostring( price ))
可以看到这里是我们调起10元充值的金额数。
我们直接将此处的price改为固定值为1
jData.productPrice = tostring( 1 )
这里我们重新加密.lua文件后不能按前一篇的方法,MT管理器直接覆盖掉apk目录下的同名文件。
因为apk安装之后路径下是没有“CallFCommand.lua”文件的,我搜索了整个手机文件都没有找到。(有知道的朋友欢迎交流)
所以我们这次采用重新打包apk。
apktool -b {路径}
打包后记得签名,如果对apktool命令不熟练,可以使用androidkiller中的apk签名。
安装后调起支付如下图,抓取到的支付信息是档位8,3000元的支付信息。
到这里我们已经修改成功,此方法只适用于商户server不校验真实充值金额的场景。商户server可以拿到充值后的订单详情,如果校验真实充值金额,那么可能会收不到充值的游戏道具。
第一次我锁定了这段错误代码,因为它的注释很清楚的有金额
local suffixTable =
{
["actor_id"] = loginProxy:GetSelectedRoleID(), -- 角色id
["ext"] = tostring(os.time()), -- 透传参数
["game_coin"] = tostring(game_coin), -- 游戏币数量
["game_id"] = tostring(moduleID), -- 游戏id
["money"] = tostring(price), -- 付款金额(元)
["product_id"] = tostring(id), -- 充值档位
["sid"] = loginProxy:GetSelectedServerId(), -- 区服id
["subject"] = tostring(name), -- 物品描述
["uid"] = tostring(AuthProxy:GetUsername()), -- 用户账号
["platform"] = platform, -- 渠道id
["sChrName"] = envProxy:GetAPKPackageName(), -- 包名
["actid"] = actID, -- 活动ID
}
我们将付款金额改为固定值1
["money"] = tostring(1), -- 付款金额(元)
我们看它返回的money还是10,我们尝试修改这个返回值,看是否可以
点击链接右键 -> save Response -> Map local Settings
但依然没有成功修改数值,此时我再次查看lua代码时才发现另一处代码。应该就是商户server返回信息调起支付的代码。跳转文章开头。