这个游戏在破解的时候,利用我上一篇介绍的针对移动MM的一般解法,搜索“PurchaseCoce”或者在“onBillingFinish”方法,进行设置,就可以让支付SDK的界面显示“支付发送成功”。
但是想不到是,在点击“确定”返回,一般增加金币的操作并没有执行,而是跳出了一个 Dialog“等待游戏到账..”,然后提示“订单延迟到账,请联系客服”。
可以料想,该游戏在验证通过“短信发送成功”后还是向服务端验证是否计费成功,计费成功了 才会发放相应的金币。
那么我们就循序渐进,搜索关键词“等待游戏到账..”可以来到方法 .method protected onCreateDialog(I)Landroid/app/Dialog; 根据代码得知,这个是设置提示信息的,不是我们要找的关键。
我们再试着搜索“订单延迟到账”,找到方法 .method protected varargs doInBackground 我们看下代码:
invoke-virtual {v7, v8, v6}, Lcom/moling/core/util/proxy/pay/BasePayProxy;->validOrder(Ljava/lang/String;Ljava/lang/String;)Z
move-result v6
if-eqz v6, :cond_1 //关键跳
.line 101
iget-object v7, p0, Lcom/moling/core/util/proxy/pay/BasePayProxy$2;->this$0:Lcom/moling/core/util/proxy/pay/BasePayProxy;
const/4 v6, 0x0
aget-object v6, p1, v6
check-cast v6, Ljava/lang/String;
const/4 v8, 0x0
invoke-virtual {v7, v6, v8}, Lcom/moling/core/util/proxy/pay/BasePayProxy;->payFinish(Ljava/lang/String;Z)V //调用成功购买的方法
.line 125
.end local v2 # "sleep":I
.end local v3 # "t1":J
.end local v5 # "time":I
:goto_0
const/4 v6, 0x0
return-object v6
.line 104
.restart local v2 # "sleep":I
.restart local v3 # "t1":J
.restart local v5 # "time":I
:cond_1
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v6
const-wide/16 v8, 0x3e8
div-long/2addr v6, v8
:try_end_1
.catch Lcom/moling/core/exception/PayExcetion; {:try_start_1 .. :try_end_1} :catch_1
.catch Ljava/lang/Exception; {:try_start_1 .. :try_end_1} :catch_2
sub-long v3, v6, v3
.line 105
int-to-long v6, v5
sub-long/2addr v6, v3
long-to-int v5, v6
.line 112
.end local v3 # "t1":J
:cond_2
sub-int/2addr v5, v2
.line 113
if-gtz v5, :cond_0
.line 114
:try_start_2
new-instance v6, Lcom/moling/core/exception/PayExcetion;
const-string v7, "DELAY"
const-string v8, "\u8ba2\u5355\u5ef6\u8fdf\u5230\u8d26\uff0c\u8bf7\u8054\u7cfb\u5ba2\u670d" //获取订单失败的提示。
然后保存 即可成功得到金币。
=====
联通卡转向移动支付SDK的方法:是将检测网络标识的函数返回值永远指向移动接口。这样就算是联通卡也会调用移动的支付接口,破解了移动接口,也就破解了全运营商的购买。