安卓逆向之二__《全民捕鱼》游戏内购破解

环境简介

系统:Android 4.4
工具:Windows 10 64bit 夜神模拟器
        Android Killer

Java Decompiler

全民捕鱼游戏简介

游戏名称:全民捕鱼
游戏类型:休闲益智
游戏版本:1.7

游戏界面如下:

逆向分析

首先我们进入商城点击付费金币的购买,弹出"购买失败"的Toast(吐司)

根据这个提示我们使用AndroidKiller分析这个APK.看到入口函数为LogoActivity很简单.

直接使用特征Toast字符串搜索,没有搜到.

再次测试把字符串转换为UniCode形式(下边的小a大A按钮),再次搜索,找到一个字符串结果

双击到使用处的语句,查看源码发现此处有购买成功失败函数的选择调用语句

我们通过这几个函数继续查找对比,最后在搜索payFail的最后一个结果,发现重要函数所在

支付失败,与支付成功函数离得很近,分析发现,函数参数也相似

所以我们使用的破解内购的办法可以是,把支付成功函数的函数体,整个复制到支付失败函数里边去,让支付永远成功.

两个函数smali代码

.method public payFailed(Ljava/util/Map;I)V.locals 5.param p1, "params"    # Ljava/util/Map;.param p2, "arg1"    # I.prologue.line 208const-string v0, "cocos2d-x debug info"new-instance v1, Ljava/lang/StringBuilder;invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()Vconst-string v2, "Failed DX_payCode2 == "invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;move-result-object v1sget-object v2, Lcom/payCom/org/IAPListener;->DX_PAYCODES:[Ljava/lang/String;iget-object v3, p0, Lcom/payCom/org/IAPListener$1;->this$0:Lcom/payCom/org/IAPListener;iget v3, v3, Lcom/payCom/org/IAPListener;->curPayIndex:Iaget-object v2, v2, v3invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;move-result-object v1invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;move-result-object v1invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I.line 209const-string v0, "cocos2d-x debug info"new-instance v1, Ljava/lang/StringBuilder;invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()Vconst-string v2, "FaildCode == "invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;move-result-object v1invoke-virtual {v1, p2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;move-result-object v1invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;move-result-object v1invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I.line 210iget-object v0, p0, Lcom/payCom/org/IAPListener$1;->this$0:Lcom/payCom/org/IAPListener;iget v0, v0, Lcom/payCom/org/IAPListener;->curPayIndex:Iconst/4 v1, 0x0invoke-static {v0, v1}, Lcom/payCom/org/GameJni;->OderFinish(II)V.line 211sget-object v0, Lcom/payCom/org/IAPListener;->iapHandler:Lcom/payCom/org/IAPHandler;sget-object v1, Lcom/payCom/org/IAPListener;->iapHandler:Lcom/payCom/org/IAPHandler;const/16 v2, 0x2715sget-object v3, Lcom/payCom/org/IAPListener;->DX_PAYCODES:[Ljava/lang/String;iget-object v4, p0, Lcom/payCom/org/IAPListener$1;->this$0:Lcom/payCom/org/IAPListener;iget v4, v4, Lcom/payCom/org/IAPListener;->curPayIndex:Iaget-object v3, v3, v4invoke-static {v1, v2, v3}, Landroid/os/Message;->obtain(Landroid/os/Handler;ILjava/lang/Object;)Landroid/os/Message;move-result-object v1invoke-virtual {v0, v1}, Lcom/payCom/org/IAPHandler;->sendMessage(Landroid/os/Message;)Z.line 212return-void
.end method.method public paySuccess(Ljava/util/Map;)V.locals 5.param p1, "params"    # Ljava/util/Map;.prologue.line 202const-string v0, "cocos2d-x debug info"new-instance v1, Ljava/lang/StringBuilder;invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()Vconst-string v2, "Success DX_payCode1"invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;move-result-object v1sget-object v2, Lcom/payCom/org/IAPListener;->DX_PAYCODES:[Ljava/lang/String;iget-object v3, p0, Lcom/payCom/org/IAPListener$1;->this$0:Lcom/payCom/org/IAPListener;iget v3, v3, Lcom/payCom/org/IAPListener;->curPayIndex:Iaget-object v2, v2, v3invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;move-result-object v1invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;move-result-object v1invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I.line 203iget-object v0, p0, Lcom/payCom/org/IAPListener$1;->this$0:Lcom/payCom/org/IAPListener;iget v0, v0, Lcom/payCom/org/IAPListener;->curPayIndex:Iconst/4 v1, 0x1invoke-static {v0, v1}, Lcom/payCom/org/GameJni;->OderFinish(II)V.line 204sget-object v0, Lcom/payCom/org/IAPListener;->iapHandler:Lcom/payCom/org/IAPHandler;sget-object v1, Lcom/payCom/org/IAPListener;->iapHandler:Lcom/payCom/org/IAPHandler;const/16 v2, 0x271asget-object v3, Lcom/payCom/org/IAPListener;->DX_PAYCODES:[Ljava/lang/String;iget-object v4, p0, Lcom/payCom/org/IAPListener$1;->this$0:Lcom/payCom/org/IAPListener;iget v4, v4, Lcom/payCom/org/IAPListener;->curPayIndex:Iaget-object v3, v3, v4invoke-static {v1, v2, v3}, Landroid/os/Message;->obtain(Landroid/os/Handler;ILjava/lang/Object;)Landroid/os/Message;move-result-object v1invoke-virtual {v0, v1}, Lcom/payCom/org/IAPHandler;->sendMessage(Landroid/os/Message;)Z.line 205return-void
.end method

修改完成后,保存,并重新编译

在夜神模拟器上卸载之前的原版游戏,安装破解后的游戏,实现了商城内购破解

添加个人信息的破解

为了更有趣一点,我们在购买成功的提示上添加自己的个人信息

我们再次搜索到"购买成功"提示,在字符串之前加入"Hades破解:",如下,最后再次编译,安装测试

完成破解:

总结:

安卓游戏内购的破解简单的思路都是大同小异,也可以更改调用的函数参数等.smail代码与伪Java代码很接近自然语言逻辑思路,在没有安卓加固(壳)的游戏上做一些内购破解还是很简单的.去网上Download几个游戏练习一下破解就很有成就感.

安卓逆向(Android)之二__《全民捕鱼》游戏内购破解相关推荐

  1. 安卓游戏内购破解切水果大战(替换法和Switch法)

    继<安卓游戏内购破解之滚动的天空>之后根据大神的帖子,实现破解一款游戏内购! 使用替换法和Switich方法 工具:依旧是Android Killer1.3.1.0 + JDK1.7 软件 ...

  2. 安卓游戏内购破解之滚动的天空

    继<教我兄弟学Android逆向02 破解第一个Android程序>之后根据大神的帖子,实现破解一款游戏 内购! 工具:依旧是Android Killer1.3.1.0 + JDK1.7 ...

  3. Android逆向之旅--疯狂兔子无敌跑跑 内购破解教程

    感谢「一块硬币」同学投稿,也热烈欢迎其他同学来投稿,分析是一种快乐,也是一种精神! 今日偶然看到一个还算热门的游戏,看到里面有内购的方法.尝试破解一下 1.拖入AK后重打包,一切顺利安装到手机上后发现 ...

  4. 安卓逆向_14 --- 单机和弱联网游戏内购 突破口 和 思路

    From:https://www.bilibili.com/video/BV1UE411A7rW?p=41 Android 逆向资源收集( apk ):https://blog.csdn.net/qq ...

  5. [安卓逆向]android adb常用命令及使用案例

    [安卓逆向]android adb常用命令 一.调试相关 1.开启adb服务 adb start-server 2.关闭adb服务 adb stop-server 3.列出所有连接的设备 adb de ...

  6. 安卓逆向之JAVA层静态分析(愤怒的小鸟去广告,充值破解)

    安卓逆向之JAVA层静态分析(愤怒的小鸟去广告,充值破解) 前言 今天女票跟我吐槽,自己闲来无事下个愤怒的小鸟玩玩,结果又是实名认证,又是广告啥的,瞬间没心情玩了,我听后大惊,还有这种事.跟女票说:& ...

  7. Android逆向实例笔记—手游中的内购破解(火柴人联盟最新版1.9.2 BB弹 )

    最近学到了一些内购的破解方式,就来试试手.然后找个了比较火爆的游戏BB弹,找个个没壳的就来练习. 这些东西都是大神写烂了的东西了,我这里只是写出我自己找不到方法的时候的思路.勿笑. 一.BB弹 BB弹 ...

  8. 全民捕鱼游戏1.3.1.7原版吸粉小游戏模块

    ​1.深度实践Spark机器学习 PDF 超清版 深度实践Spark机器学习电子书封面 读者评价 本课程主要讲解基于Spark 2.x的机器学习库,MLlib实现了常用的机器学习,如:聚类.分类.回归 ...

  9. 安卓逆向系列教程 4.3 登山赛车内购破解

    4.3 登山赛车内购破解 作者:飞龙 首先在这里下载游戏:http://g.10086.cn/game/760000032287?spm=www.pdindex.android.addjgame.1 ...

最新文章

  1. 协程Coroutines入门
  2. Calc3: Geometrics
  3. [转]asp.net文件下载方法...
  4. poj 3348(求凸包面积)
  5. python-day1-login练习
  6. 发现文件夹和文件夹都显示为蓝色和绿色,是否中毒了?
  7. 『转』line-height
  8. SAP Spartacus基于travis的持续集成
  9. Spark权限问题:Spark-submit运行报错 Permission denied user=deploy
  10. Mysql学习总结(37)——Mysql Limit 分页查询优化
  11. 如何安装.nupkg文件?
  12. 【uart篇】synopsys uart vip配置使用
  13. STM32中断编程步骤
  14. 程序猿财务自由之路·规划篇
  15. [707]Apache NiFi安装及简单使用
  16. win环境20分钟搭建php+sql服务器Apache+php+mysql在windows下的安装与
  17. SQLyog设置唯一
  18. 贝勒大学计算机专业,贝勒大学计算机科学.pdf
  19. 医疗器械行业CRM客户管理软件价值
  20. 通信原理 简易2DPSK的相干解调与非相干解调的matlab实现

热门文章

  1. 如何成为优秀的UI设计师
  2. 【ESP 保姆级教程】疯狂Node.js服务器篇 ——案例:ESP8266 + MQ3酒精传感器 + NodeJs本地服务 + 文件存储数据
  3. 亚马逊广告投放策略卖家们知多少?
  4. Lipschitz条件
  5. 声音信号 dB 及 dBA 的计算方式
  6. AWK中的OFS的问题
  7. Zookeeper学习笔记2-------group创建、查询、删除
  8. 两阶段随机规划模型简介
  9. 嗨!爱莫就是传说中隔壁家公司 | 精彩传送门
  10. 图片水印怎么去掉?图片水印去除方法