看别人的博客,心想,写起来不会很难吧,大概就是把自己的思路写下来。但对于我自己,实际写时,才能感受到,要把自己的想法表达出来不简单。实属汗颜。
前言
仅限于技术交流,看不惯的人、键盘侠们,可以离开了,不用多嘴。
**修改程序,是用程序语言表达自身意愿的过程。**基本的语法知识,是必需的。例如:Java、Smali。接下来会讲解破解的常用手法。总的来说,会写程序,就会修改(破解)程序,因为在写程序时,会理解如何实现方法Void,修改时只是需要用Smali语法表达你的意愿。
历程
文章末尾有附件下载。(基于Moto G修改)
00x00 思路
寻找检测捐赠信息的方法,将其修改,使其方法返回固定值(mkcenter捐赠68cny后,才能使用全部功能,所以准备修改为68cny,想要修改为66666也行)
00x01 准备
使用工具当前Activity(或者其他软件,这里用的是“开发者助手”),查找魔趣中心的activity,可看到如下结果。 获取到了activity,可以缩小目标范围,定位代码。
01x00 开始
以zip方式打开apk文件,使用dex编辑器打开class.dex
,并打开上图中所显示的activity,寻找方法。 如上图,并未找到相关方法(全是activity操作方法)
**首先考虑,如何检测捐赠信息,并判断捐赠金额?**在这里,需要些许经验。例如:魔趣系统的license.class(其中包含生成license方法,以及校验),是不存在于任何apk的,内置于framework的jar中。这里介绍两种方法。
方法1
但是我们只需要知道,哪些class调用了license方法,就可以知道究竟哪些class是我们需要的。
在dex中搜索License
字样,在搜索到的class中,寻找正确的class即可。
方法2
更简单的思路。魔趣判断是否能使用全部功能,肯定会校验捐赠金额是否达到68cny。所以,我们只需要搜索包含68的class即可(需要注意的是,在smali下,数字是以16进制表示,请搜索16进制字符)。
通过上面两种方法其一,或者并用,会找到这个class。
01x01 定位
找到class之后,就是定位方法Void了。判断最易修改的方法,需要找到对应的特性,可能找到的方法,修改后都能达到效果,但是,修改某些方法可以一步实现。
例如com.mokee.center.fragment
内的class中,有关于控制魔趣中心的方法(例如:isOTA
方法),但是治标不治本。通过观察,可以发现,程序内部检测捐赠信息,是通过com.mokee.center.utils.Utils
类中getPaidTotal()方法获取捐赠金额(get获取,paid支付过的,total全部,就是字面意)
01x02 修改
本篇难点:Smali修改。如何使此方法返回68f?(f指float类型)这里需要用到smali知识,感兴趣Google搜索学习,不感兴趣,可以直接复制下面的代码,替换getPaidTotal内全文。下图是修改后的getPaidTotal方法。
const v0 0x47823500
new-instance v1 Ljava/lang/Float;
invoke-direct {v1,v0} Ljava/lang/Float;-><init>(F)V
return-object v1
注意修改寄存器数量
02x00 后继
保存并退出。由于魔趣中心属于系统软件,system分区下不需要修改签名,也不要修改签名。
将apk替换到/system/priv-app/MokeeCenter/MokeeCenter.apk
,随后强制停止魔趣中心(重启手机也可以),然后重启魔趣中心,即可应用修改。
02x01 问题
这种修改方式,会造成后遗症-----无法OTA。解决方法:使用修改版下载OTA文件后,替换回原版魔趣中心,再安装OTA。或者修改OTA包内META-INF/com/google/android
内文件,将包含MokeeCenter
的行删除。
03x00 下载
附件:暂无(回家之后发布)
想要更好的破解方案?例如直接生成mokee.license文件,请关注我的下一篇博文。