Google Play 许可验证去除方法

某些游戏中 Google_Play 许可证验证的简单去除方法!

前言

一些以 Google Play 为官方发布渠道的应用、游戏会在启动时通过手机上的 Google Play 框架查询当前应用是否是从 Google Play 商店合法购买安装的,如果不是,会拒绝运行。

如 Minecraft(国际版):(本方法适用但不局限于此应用)

Minecraft.jpg

分析

对于此类应用,一般是使用了 Google Play 的许可证验证 API。

要想去除,要先学会如何加上,让我们前往 Google 的 Android 开发文档查询一下:

https://developer.android.com/google/play/licensing/overview.html

这里面有一张图,演示了许可证的检查过程:

play_licensing.png

可以看出,应用先向手机上的 Google Play 框架提出请求,然后由 Google Play 向服务器进行验证(过程加密),再返回给应用。

另一张图更实用,展示了应用在验证过程中的具体操作:

License_Checker.png

由此看出,关键函数就是 LicenseChecker.checkAccess()。

应用会调用 LicenseChecker.checkAccess(),checkAccess() 方法会进行检查,如果结果是许可证有效则会调用应用给出的回调中的 allow(),否则调用 dontAllow(),遇到错误则调用 applicationError()。

由此可得出思路:

修改 checkAccess(),使其不管查询结果为何,都无条件调用 LisenceCheckerCallback.allow()。达到破解目的.

实战

(在手机上使用 MT 管理器(BinMT)完成)

第一步 (打开 dex 文件)

打开安装包中的 classes.dex 文件

第二步 (找到 checkAccess 查看)

找到 com.googleplay.licensing.LicenseChecker 并打开,查看 Smali

在 Smali 编辑器界面使用搜索功能,搜索 checkAccess

mt_check_access.jpg

第三步 (分析并修改)

接下来开始分析这段代码:

hack_check_access.jpg

这个函数从图中第 2 行开始,开头是一些信息之类的内容。

从第 6 行开始是函数体,第 10 行是一个 try-catch 异常处理块的开头,里面是可能出现异常的代码。这个块里便是我们要寻找的关键。

第 11 到 15 行的代码用 Java 写出来就是:

1
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(也可以直接删掉)

第四步 (保存并签名)

保存、编译、保存、签名、安装

mc_Index_1.jpg

mc_Index_2.jpg

免责声明

仅限用于学习和研究目的;

不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

结尾

这就是本文的全部内容啦,本文分析中的所有图片均出自 Android 开发文档,在此感谢一下。