前言
一些以 Google Play 为官方发布渠道的应用、游戏会在启动时通过手机上的 Google Play 框架查询当前应用是否是从 Google Play 商店合法购买安装的,如果不是,会拒绝运行。
如 Minecraft(国际版):(本方法适用但不局限于此应用)
#分析
对于此类应用,一般是使用了 Google Play 的许可证验证 API。
要想去除,要先学会如何加上,让我们前往 Google 的 Android 开发文档查询一下:
https://developer.android.com/google/play/licensing/overview.html
这里面有一张图,演示了许可证的检查过程:
可以看出,应用先向手机上的 Google Play 框架提出请求,然后由 Google Play 向服务器进行验证(过程加密),再返回给应用。
另一张图更实用,展示了应用在验证过程中的具体操作:
由此看出,关键函数就是 LicenseChecker.checkAccess()。
应用会调用 LicenseChecker.checkAccess(),checkAccess() 方法会进行检查,如果结果是许可证有效则会调用应用给出的回调中的 allow(),否则调用 dontAllow(),遇到错误则调用 applicationError()。
由此可得出思路:
修改 checkAccess(),使其不管查询结果为何,都无条件调用 LisenceCheckerCallback.allow()。达到破解目的.
实战
(在手机上使用 MT 管理器(BinMT)完成)
第一步-打开-dex-文件
打开安装包中的 classes.dex 文件
第二步-找到-checkaccess-查看
找到 com.googleplay.licensing.LicenseChecker 并打开,查看 Smali
在 Smali 编辑器界面使用搜索功能,搜索 checkAccess
第三步-分析并修改
接下来开始分析这段代码:
这个函数从图中第 2 行开始,开头是一些信息之类的内容。
从第 6 行开始是函数体,第 10 行是一个 try-catch 异常处理块的开头,里面是可能出现异常的代码。这个块里便是我们要寻找的关键。
第 11 到 15 行的代码用 Java 写出来就是:
bool v1 = this.mPolicy.allowAccess();
这是尝试在本地缓存中查找有没有此应用的许可证,如有就返回 1 (true),没有就返回 0 (false)。
紧接着重头戏就来了,第 17 行判断如果 v1 是 0(即 false)就跳转到 :cond_17(进行联网检查许可证)否则继续执行。
而继续执行便是我们希望看到的 allow()。
因此我们只要不让程序跳到 :cond_17 就一定能通过验证。
综上分析修改方法呼之欲出:
把第 17 行整行的 if-eqz v1, :cond_17 改成 nop(也可以直接删掉)
第四步-保存并签名
保存、编译、保存、签名、安装
免责声明
仅限用于学习和研究目的;
不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
结尾
这就是本文的全部内容啦,本文分析中的所有图片均出自 Android 开发文档,在此感谢一下。
这是灰色的短代码框,常用来引用资料什么的
这是黄色的短代码框,常用来做提示,引起读者注意。
这是红色的短代码框,用于严重警告什么的。
这是浅蓝色的短代码框,用于显示一些信息。
这是绿色的短代码框,显示一些推荐信息。