Android破解-滚动的天空

##前言
最近看到很多学生在玩滚动的天空这个游戏,这游戏看起来还挺有趣的,于是我也去下载玩了几把。可是,坑呐,这游戏太难了,考验人的快速判断能力和手指滑动速度,玩的很渣。玩游戏技术不行怎么办呢?俗话说,能力不够金钱来凑!哈哈哈,游戏世界不都是这样的吗?各个游戏界的大神哪个不是用金钱堆起来的。玩游戏只是为了娱乐,能够用一点金钱来购买的娱乐有什么关系呢?反正我的理解是这样的。于是,能不住想要购买道具了。但是,突然又想到,我们学IT的,玩这个小游戏还需要花钱?自己破解游戏不就好了吗?于是,就开始动工了。从中午休息时间开始就着手去做这件事了,搞到我中午都没有休息,下午下班后回到家继续搞事情。直到晚上九点,终于把这破游戏破解成功了。

##使用的技术和工具
话说,磨刀不误砍材工,要想破解一款软件,至少要懂该软件的基本编程,所以破解Android软件是需要懂得Android应用的编程才可以的。其中用到的技术当然少不了大名鼎鼎的Java语言,然后是Android开发基础,要懂得Android SDK的功能和使用,会基本的Smali语法。另外,还需要使用一些工具软件来辅助。

  1. 本次使用的APK使最新版的滚动的天空,以后如果出新版可能不适用,这是原版没有破解的APK下载地址:https://pan.baidu.com/s/1VuWRP7bhUsHg0kjsCpoNpA
    破解后的APK:
    https://pan.baidu.com/s/1F0JomQeEKRqE-hUn8k9yUA
  2. 使用Android Killer V1.3.1.0版本的反编译工具,这个工具很强大适合初学者使用,想要深入学习的话最好用其他的软件。http://www.ouyaoxiazai.com/soft/yyrj/158/38785.html#dizhi
  3. APKTool V2.3.4,大名鼎鼎的反编译工具
    https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.3.4.jar

##破解过程

###第一步:反编译APK
打开Android Killer,直接鼠标拖动安装包APK文件到窗口,会自动反编译

如果出现失败的情况,则需要下载最新的apktool.jar,手动添加到Android Killer中

###第二步:寻找破解关键点
下面,在道具商城点击商品的的时候会提示:sim卡与支付服务运营商不匹配或网络未连接,请检查网或无法购买,未插入sim卡等信息,在Android Killer中可以根据这个提示的内容搜索到这个内容在项目中出现的位置。

可以看到这个字符串是在Strings.xml中定义的,代码通过这个字符串的id来调用这个字符串。接着,可以在public.xml中看到这个字符串的id值

然后,搜索这个ID值0x7f050028就可以找到在代码中调用这个字符串的位置

可以看到,在a.smali文件中调用了这个字符串,下面是调用这个字符串的函数的全部内容:

.method public static b(Ljava/lang/String;Landroid/content/Context;Lcom/turbochilli/rollingsky/pay/PayAgent;I)V.locals 2.prologue.line 302invoke-static {p1}, Lcom/turbochilli/rollingsky/util/NetUtil;->isNetworkAvailable(Landroid/content/Context;)Zmove-result v0if-nez v0, :cond_0.line 303const v0, 0x7f050022invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;move-result-object v0invoke-static {p1, v0}, Lcom/turbochilli/rollingsky/util/CommonUtil;->showToast(Landroid/content/Context;Ljava/lang/String;)V.line 322:goto_0return-void.line 306:cond_0invoke-static {}, Lcom/turbochilli/rollingsky/util/CommonUtil;->isFlavorTelecom()Zmove-result v0if-eqz v0, :cond_2.line 307invoke-static {}, Lcom/turbochilli/rollingsky/util/CommonUtil;->getSimOperator()Ljava/lang/String;move-result-object v0.line 308invoke-static {v0}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Zmove-result v1if-eqz v1, :cond_1.line 309const v0, 0x7f050023invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;move-result-object v0invoke-static {p1, v0}, Lcom/turbochilli/rollingsky/util/CommonUtil;->showToast(Landroid/content/Context;Ljava/lang/String;)Vgoto :goto_0.line 311:cond_1invoke-static {}, Lcom/turbochilli/rollingsky/util/CommonUtil;->getCurrentFLAVOR()Ljava/lang/String;move-result-object v1invoke-static {v1, v0}, Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Zmove-result v0if-nez v0, :cond_2.line 312const v0, 0x7f050028invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;move-result-object v0invoke-static {p1, v0}, Lcom/turbochilli/rollingsky/util/CommonUtil;->showToast(Landroid/content/Context;Ljava/lang/String;)Vgoto :goto_0.line 316:cond_2if-eqz p2, :cond_3.line 317const/4 v0, 0x0new-instance v1, Lcom/turbochilli/rollingsky/b/a;invoke-direct {v1, p0}, Lcom/turbochilli/rollingsky/b/a;-><init>(Ljava/lang/String;)Vinvoke-virtual {p2, p0, v0, v1}, Lcom/turbochilli/rollingsky/pay/PayAgent;->pay(Ljava/lang/String;ILcom/turbochilli/rollingsky/pay/PayCallback;)Vgoto :goto_0.line 319:cond_3const v0, 0x7f050021invoke-virtual {p1, v0}, Landroid/content/Context;->getString(I)Ljava/lang/String;move-result-object v0invoke-static {p1, v0}, Lcom/turbochilli/rollingsky/util/CommonUtil;->showToast(Landroid/content/Context;Ljava/lang/String;)Vgoto :goto_0
.end method

通过代码可以看到,前面很多的内容都是用来判断网络状况、SIM运营商等信息的,我们可以把它们全部删掉,只留下调用支付功能的核心代码,改动后如下:

.method public static b(Ljava/lang/String;Landroid/content/Context;Lcom/turbochilli/rollingsky/pay/PayAgent;I)V.locals 2.prologue.line 302#点击道具商品后,执行到这里,去除了判断网络SIM卡等代码 const/4 v0, 0x0new-instance v1, Lcom/turbochilli/rollingsky/b/a;invoke-direct {v1, p0}, Lcom/turbochilli/rollingsky/b/a;-><init>(Ljava/lang/String;)V#这里调用支付功能invoke-virtual {p2, p0, v0, v1}, Lcom/turbochilli/rollingsky/pay/PayAgent;->pay(Ljava/lang/String;ILcom/turbochilli/rollingsky/pay/PayCallback;)Vgoto :goto_0:goto_0return-void.end method

保持文件,点击编译,会提示编译成功,把安装包安装到手机上,可以看到,点击道具后直接就弹出了支付方式选择界面,没有再提示网络情况和SIM卡情况的现象了。但是,到这里并没有破解成功,依旧还是需要支付的。

###第三步:找到支付回调

从上面可以看到PayAgent类是一个抽象类,下面是PayAgent.smali最前面的内容:

.class public abstract Lcom/turbochilli/rollingsky/pay/PayAgent;
.super Ljava/lang/Object;
.source "PayAgent.java"

查看这个类的内容,可以看到里面的pay函数是一个抽象函数:

.method public abstract pay(Ljava/lang/String;ILcom/turbochilli/rollingsky/pay/PayCallback;)V
.end method

所以,必须要找到这个类的实现类才能定位到真正的支付功能的代码,查看PayAgent.smali同目录的其他文件,很容易可看到,pay这个目录下面的内容都是支付相关的代码,查看各个类内容,可以找DianxinPay继承自PayAgent,所以DianxinPay里面的pay函数才是真正的支付代码。后面还有接着,EgamePay才是真正的支付网络请求,这里就不详细展开了。通过这些追踪,最后找到DianXinPay$3.smali文件里面有三个支付结果回调:

.method public payCancel(Ljava/util/Map;)V
.method public payFailed(Ljava/util/Map;I)V
.method public paySuccess(Ljava/util/Map;)V

把payCancel函数里面的所有内容替换为paySuccess里面的内容,这时候破解完成,当在APP中取消支付的时候,会实现支付完成的效果。下面是payCancel函数的内容:

.method public payCancel(Ljava/util/Map;)V.locals 4.annotation system Ldalvik/annotation/Signature;value = {"(","Ljava/util/Map","<","Ljava/lang/String;","Ljava/lang/String;",">;)V"}.end annotation.prologue.line 187#雷:这里是核心关键的破解位置,在弹出的支付界面直接退出支付界面会调用这个取消支付的函数,把内容#全部替换为支付成功函数的内容就可以了。const-string v0, "DianXinPay"const-string v1, "paySuccess"invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I.line 171iget-object v0, p0, Lcom/turbochilli/rollingsky/pay/DianXinPay$3;->this$0:Lcom/turbochilli/rollingsky/pay/DianXinPay;invoke-static {v0}, Lcom/turbochilli/rollingsky/pay/DianXinPay;->access$300(Lcom/turbochilli/rollingsky/pay/DianXinPay;)Lcom/turbochilli/rollingsky/pay/PayCallback;move-result-object v0if-eqz v0, :cond_0.line 172invoke-static {}, Lcom/turbochilli/rollingsky/c;->a()Lcom/turbochilli/rollingsky/c;move-result-object v0invoke-virtual {v0}, Lcom/turbochilli/rollingsky/c;->h()Lcom/turbochilli/rollingsky/c$b;move-result-object v0iget-object v1, p0, Lcom/turbochilli/rollingsky/pay/DianXinPay$3;->val$orderId:Ljava/lang/String;invoke-interface {v0, v1}, Lcom/turbochilli/rollingsky/c$b;->b(Ljava/lang/String;)V.line 173iget-object v0, p0, Lcom/turbochilli/rollingsky/pay/DianXinPay$3;->this$0:Lcom/turbochilli/rollingsky/pay/DianXinPay;invoke-static {v0}, Lcom/turbochilli/rollingsky/pay/DianXinPay;->access$300(Lcom/turbochilli/rollingsky/pay/DianXinPay;)Lcom/turbochilli/rollingsky/pay/PayCallback;move-result-object v0iget-object v1, p0, Lcom/turbochilli/rollingsky/pay/DianXinPay$3;->val$product:Lcom/turbochilli/rollingsky/pay/IProduct;const/16 v2, 0xbinvoke-interface {v0, v1, v2}, Lcom/turbochilli/rollingsky/pay/PayCallback;->onSendOrderInfo(Lcom/turbochilli/rollingsky/pay/IProduct;I)V.line 175:cond_0return-void
.end method

###第四步:打包文件、破解成功
保存文件,点击编译

编译成功后,把APK重新安装到手机(需要把原来的APK卸载才能安装),终于搞定,可以愉快的玩耍了。
#练习
下面的游戏以类似的方式可以破解,笔者已经测试通过,有兴趣的同学可以试着去玩玩。

游戏名字 原版下载 破解版下载
滚动的天空 https://pan.baidu.com/s/1qnvA0HfdERwXWxFNNQ0vYg https://pan.baidu.com/s/12nYBnF9xZguT85IRa96t0Q
3D狂野飞车2极速前进 https://pan.baidu.com/s/1BU58b40c2R5PUurNXg7UPA https://pan.baidu.com/s/1DvG8n5z5hAe0QPvEPUtl1w
宝宝打地鼠 https://pan.baidu.com/s/1eKC5aXFL7vIhvMdw1nP5sg https://pan.baidu.com/s/16ZMMGKKpSAQjQbLwd48eHQ

Android破解过程-滚动的天空相关推荐

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

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

  2. 【android逆向笔记】(二)滚动的天空逆向

    对滚动的天空游戏APP进行逆向 效果:可以无限购买. ps:参考教程 https://www.52pojie.cn/thread-632178-1-2.html 因为是初学,所以对一些代码方面就会笔记 ...

  3. Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果 转:http://blog.csdn.net/xiaanming/article/details/17374599 很荣 ...

  4. Android 破解APK

    转至:http://www.52pojie.cn/thread-373814-1-1.html 前言: 经常遇到这种问题,最新版的软件更新了,但是却没有最新版的 破解版,等待破解作者更新,有可能很快, ...

  5. Android破解与防破解

    Android 破解(仅用于学习参考,而不是恶意去破解别人的东西) 过程: 1.用apktool对apk进行解压     2.修改smali文件(注1)     3.用apktoo打包成apk文件   ...

  6. Android 系统启动过程

    文章来源于网络,心得来源于整理. 请尊重作者:http://hi.baidu.com/guoxiaoming/blog/item/24e9e9f8c9628f1fd9f9fd89.html/cmtid ...

  7. android gridview 停止滚动

    http://blog.csdn.net/yaphetzhao/article/details/50544105 参考上面的博客,关键代码我就贴出来吧: public void stopGridVie ...

  8. cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客

    cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客 Cadence Allegro16.5详细安装具体的步骤 1.下载SPB16.5下来后,点setup.exe,先安装第一项 ...

  9. Android启动过程深入解析【转】

    转自:http://www.open-open.com/lib/view/open1403250347934.html 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么 ...

最新文章

  1. TCP/IPICMP报文的分类
  2. android 摄像头预览左右镜像_OpenJDK镜像的tag说明
  3. OpenCL 第6课:矩阵转置
  4. Centos 的安装(2)
  5. python sublime 提示补全_【原创】Sublime+Verilator建立强大的verilog编写环境
  6. 7-16 求符合给定条件的整数集
  7. 吴恩达机器学习总结五:单变量线性回归实战
  8. Spring Bean的循环依赖解决方案
  9. Eclipse 中 去掉控制台最大行数限制
  10. 深入内核:Oracle数据提交与事务隔离的深度解析
  11. 微信小程序——诉讼费计算
  12. 思科ccnp认证工程师必看
  13. Android Audio音频系统之深入浅出
  14. 记虚拟机装黑苹果踩坑及步骤
  15. launch参数JAVA_javafx主要方法launch(args)如何工作? - java
  16. mooc-人工智能与信息社会-基于决策树和搜索的智能系统(上)
  17. 列表推导式+生成器+面向对象一(对象的结构+类的定义)2020-22-23
  18. 科学计算机 app,‎App Store 上的“超级计算器-科学计算机”
  19. 【C语言】以通讯录为例理解宿舍管理系统,图书管理系统完成C语言期末作业。源代码见文章末尾
  20. 服务器被打了之后怎么办?

热门文章

  1. python实用案例题
  2. 新版标准日本语初级_第三十一课
  3. 理财等额本息和等额本金计算公式
  4. python开启摄像头以及深度学习实现目标检测
  5. 百度APP-Android H5首屏优化实践
  6. 中间视频上下图片的视频效果怎么制作
  7. Java8实战读书笔记-第3章 λ表达式
  8. 干货|机器学习-稀疏矩阵的处理
  9. 【强化记忆】生物选修三填空题考点强化记忆2-胚胎工程、安全伦理问题、生态工程——2017年2月25日...
  10. 如何应对社会人,如何应对平淡的物质世界