吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 35114|回复: 62
收起左侧

[Android 原创] 【新手】【元气骑士】尝试破解内购

  [复制链接]
jazk2004 发表于 2017-11-6 14:15
本帖最后由 jazk2004 于 2017-11-6 14:37 编辑

这是我发的第二个分享破解内购的帖子了,【第一个是:https://www.52pojie.cn/thread-658136-1-1.html
-----------------------开始--------------------------------------------
游戏:【元气骑士】https://www.taptap.com/app/34751
环境:【手机端】
工具:【MT管理器2】
过程:
第一步【获取相关提示信息】:下载游戏安装之后,过了教程,然后在“售货机”那里可以购买宝石,1元=800宝石,点击购买后,跳转到爱贝支付,然后选择取消支付,提示支付失败;
第二步【按提示信息搜索】:打开MT管理器2,找到游戏安装包,点击后以“查看”方式打开,选择classes.dex文件 -->Dex编辑器++,  这里我一般选择搜索“失败”,得到下图页面
Screenshot_2017-11-06-13-06-37-196_bin.mt.plus.png
从上往下看,第一个IAppPayOrderChecker里面没有pay相关的方法,第二个MainActivity$3$1里面看到一个OnPayResult方法,应该是这个了,打开看看,在里面搜索"fail",看到有onPayFail,那说明应该也有onPaySuccess,往下找就可以找到,具体修改方法如下,
[Java] 纯文本查看 复制代码
goto_46
    :pswitch_46      #记住这个编号,下面要修改
    invoke-static {}, Lcom/chillyroomsdk/sdkbridge/config/SdkConfig;->getInstance()Lcom/chillyroomsdk/sdkbridge/config/SdkConfig;

    move-result-object v1

    const-string v2, "publicKey"

    invoke-virtual {v1, v2}, Lcom/chillyroomsdk/sdkbridge/config/SdkConfig;->getAppParam(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v1

    invoke-static {p2, v1}, Lcom/iapppay/sdk/main/IAppPayOrderUtils;->checkPayResult(Ljava/lang/String;Ljava/lang/String;)Z  
    move-result v0   
    const-string v0,"true"  #这里是一个容易忽略的地方,因为checkPayResult方法返回值赋值给v0,所以使v0=true

    .line 101
    .local v0, "payState":Z
    const-string v0, "true"

    .line 102
    iget-object v1, p0, Lcom/chillyroomsdk/iapppay/MainActivity$3$1;->this$1:Lcom/chillyroomsdk/iapppay/MainActivity$3;

    iget-object v1, v1, Lcom/chillyroomsdk/iapppay/MainActivity$3;->this$0:Lcom/chillyroomsdk/iapppay/MainActivity;

    const-string v2, "支付成功"

    invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v1

    invoke-virtual {v1}, Landroid/widget/Toast;->show()V

    .line 103
    iget-object v1, p0, Lcom/chillyroomsdk/iapppay/MainActivity$3$1;->this$1:Lcom/chillyroomsdk/iapppay/MainActivity$3;

    iget-object v2, p0, Lcom/chillyroomsdk/iapppay/MainActivity$3$1;->val$orderId:Ljava/lang/String;

    iget-object v3, p0, Lcom/chillyroomsdk/iapppay/MainActivity$3$1;->val$productId:Ljava/lang/String;

    iget-object v4, p0, Lcom/chillyroomsdk/iapppay/MainActivity$3$1;->val$extra:Ljava/lang/String;

    invoke-virtual {v1, v2, v3, v4}, Lcom/chillyroomsdk/iapppay/MainActivity$3;->onPaySuccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V

    return-void

    goto :goto_19

然后继续往下,找到结尾,采用修改pswitch语句,达到不管什么条件,都跳转到成功的pswitch那里:
[Java] 纯文本查看 复制代码
 .line 96
    :pswitch_data_88
    .packed-switch 0x0
        :pswitch_46  #改成成功对应pswitch
        :pswitch_46  #改成成功对应pswitch
        :pswitch_46  #改成成功对应pswitch
    .end packed-switch
.end method


到这里,购买成功的修改就完成了,但是进入游戏支付还是不成功,提示“此订单没有进行支付,如有疑问请咨询客服”,这也是这个游戏的一个特点,订单验证,那咋们继续根据提示信息搜索【此订单】这几个字,就会找到一个文件IAppOrderRestore的文件,打开后,找到onPostExecute这个方法(有两个同名,找(Ljava/lang/String;)这个),打开后,再搜索【此订单】,定位到如下的位置:
[Java] 纯文本查看 复制代码
 :try_start_1f8
    move-object/from16 v0, p0

    iget-object v2, v0, Lcom/chillyroomsdk/iapppay/IAppPayOrderRestorer;->m_activity:Landroid/app/Activity;

    const-string v3, "此订单没有进行支付,如有疑问请咨询客服"

    const/4 v4, 0x1

    invoke-static {v2, v3, v4}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

    move-result-object v2

    invoke-virtual {v2}, Landroid/widget/Toast;->show()V

    .line 163
    move-object/from16 v0, p0

    iget-object v2, v0, Lcom/chillyroomsdk/iapppay/IAppPayOrderRestorer;->m_orderId:Ljava/lang/String;

    invoke-static {v2}, Lcom/chillyroomsdk/sdkbridge/order/OrderManager;->RemoveOrderFromPending(Ljava/lang/String;)V
    :try_end_20d
    .catch Lorg/json/JSONException; {:try_start_1f8 .. :try_end_20d} :catch_20e
    .catchall {:try_start_1f8 .. :try_end_20d} :catchall_258

    goto :goto_1be   

既然这里是验证失败,那找找前面的相关代码是否有验证成功等信息,找过之后没有,只有“恢复订单”,那可以猜一下代码的逻辑呢:恢复订单之后应该就是验证成功并支付,如果失败就返回不成功的信息,最后定位到2个if判断,
[Java] 纯文本查看 复制代码
  :goto_1be
    move-object/from16 v0, p0

    iget-boolean v2, v0, Lcom/chillyroomsdk/iapppay/IAppPayOrderRestorer;->m_restoreAll:Z

    if-eqz v2, :cond_23a  #判断v2如果等于0,跳转到cond_23a,通过下面的分析,这里要注释掉

    sget-object v2, Lcom/chillyroomsdk/sdkbridge/order/OrderManager;->pendingOrders:Ljava/util/ArrayList;

    invoke-virtual {v2}, Ljava/util/ArrayList;->size()I

    move-result v2

    if-lez v2, :cond_23a  #判断v2如果小于等于0,跳转到cond_23a ,通过下面的分析,这里要注释掉 
 
    .line 169

然后看 :cond_23a处的代码如下:
[Java] 纯文本查看 复制代码
 :cond_23a
    move-object/from16 v0, p0

    iget-object v2, v0, Lcom/chillyroomsdk/iapppay/IAppPayOrderRestorer;->m_dialog:Landroid/app/ProgressDialog;  #使v2=m_dialog;

    if-eqz v2, :cond_b3 #判断v2如果等于0,跳转到cond_b3 

    .line 172
    move-object/from16 v0, p0

    iget-object v2, v0, Lcom/chillyroomsdk/iapppay/IAppPayOrderRestorer;->m_dialog:Landroid/app/ProgressDialog;

    invoke-virtual {v2}, Landroid/app/ProgressDialog;->dismiss()V

    goto/16 :goto_b3  #跳转到cond_b3 
#也就是说,上面v2不管是小于等于0,还是等于0,总要调到:cond_b3的

再看:cond_b3的代码:
[Java] 纯文本查看 复制代码
 .line 189
    :cond_b3
    :goto_b3
    return-void #这里返回空值了,并且是该方法结束了,就是支付失败

所以那两个if处需要注释掉。
第三步【解除签名验证】:到这里还不算完,因为这个游戏是有签名验证的,需要弄掉签名验证(关闭网络进游戏会闪退,判断是本地签名验证),搜索signatures,这里需要注意修改"索搜类型"=代码,定位到UnityExtendActivity的GetKeyHash方法,
[Java] 纯文本查看 复制代码
.method public static GetKeyHash()Ljava/lang/String;
    .registers 7

    .prologue
    return-void  #直接插入该代码,返回空值

    const/4 v3, 0x0

到此结束了,进游戏可以购买宝石,也可以购买角色了,购买宝石需要返回一下主页(刚进游戏的那个页面)让订单验证成功才行。
作为新手,以上分享难免有错误和不足,希望各位发现后,下手轻点,希望与各位一起学习成长。

免费评分

参与人数 21吾爱币 +29 热心值 +19 收起 理由
ccs101 + 1 + 1 谢谢@Thanks!
夜步城 + 1 我很赞同!
wangleishu + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
dengyanming + 1 + 1 我很赞同!
kongyuan89 + 1 + 1 已答复!
Meng1an + 1 + 1 已答复!
羊肉串 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
极地冷战 + 1 + 1 热心回复!
rack + 1 + 1 用心讨论,共获提升!
温华 + 1 + 1 谢谢@Thanks!
qtfreet00 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wei-dingmart + 1 + 1 鼓励转贴优秀软件安全工具和文档!
l2574610544 + 1 + 1 谢谢@Thanks!
Skiing + 1 + 1 谢谢@Thanks!
东东是5 + 1 + 1 已答复!
老中医专治平胸 + 1 + 1 谢谢@Thanks!
红阳 + 1 + 1 用心讨论, 共获提升!
夏雨微凉 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
吾2破解 + 1 + 1 热心回复!
164738777 + 1 我很赞同!
8两 + 1 + 1 支持一下

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kelove 发表于 2017-11-7 18:01
本帖最后由 kelove 于 2017-11-7 18:05 编辑

    move-result v2

    if-eqz v2, :cond_3

    const-string v2, "result"

    invoke-virtual {v12, v2}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v2

    const-string v3, "0"

    invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v2

    if-eqz v2, :cond_3

    .line 150
    const-string v2, "cpprivate"

    invoke-virtual {v12, v2}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v4


我们版本好像有点不一样
我想问的是我找到这两个if 我把它注释掉就可以过了,但是我把两个if-eqz 改为if-nez 还是不行,想问问为什么
ikeeki 发表于 2017-11-6 14:31
bdboy 发表于 2017-11-6 14:37
金神主 发表于 2017-11-6 14:50
学习学习,谢谢分享
平凡路 发表于 2017-11-6 15:07
学习,支持多点
a5680497 发表于 2017-11-6 15:18

lz,我要给你点32个赞
21367245 发表于 2017-11-6 15:56
除了宝石能买RMB人物么??比如骑士之类的!!
 楼主| jazk2004 发表于 2017-11-6 16:15 来自手机
21367245 发表于 2017-11-6 15:56
除了宝石能买RMB人物么??比如骑士之类的!!

可以买rmb的人物的
左手叼根烟 发表于 2017-11-6 16:28
支持热心分享
164738777 发表于 2017-11-6 16:30
直接看smali不用对比java, 牛逼啊大兄弟{:1_931:}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表