怎破解添加代码混淆的GooglePlay游戏正版验证

于高达平等首稿子“手游apk破解及GooglePlay正版去验证经验分享
”中,遗留了一个问题:添加了代码混淆的玩乐如何处理?最近恰巧写了这一部分本子,在此总一下:
丰富混淆的游艺,反编译后代码类名和方发名基本不可读,负责正版验证部分的SDK会变成如下的范:

前举行了一段时间的安卓手游破解正版验证工作,总结一些核心的道和学识,便于分享交流。破解的目的是于国内部分“被阉割”过(无GooglePlay框架)的安卓手机也能尽情地耍上GooglePlay上的嬉戏,所以文章要讨论海外游戏市场下载的apk包如何去正版验证。国内的手游大部分要开了防破解工作之,加壳、防反编译等等(此篇不予讨论)。大概海外市场之空气较好,所以GooglePlay、Amazon商店的游艺中心都得倒编译成功,顶多加了代码混淆、调用了GP/Amazon的验证SDK而已。

混淆后的类名

入哪个看?

破解新大方、懂一些编程知识之童鞋(完全无懂得编程也可以,只能破解那些只需要替换部分文书/文本的游玩)、以及针对性apk破解/安全性维护感兴趣之童鞋。

而是代码混淆并无能够混淆字符串(这吗是怎么而就此加壳工具、字符串编码了),于是抱在梦想耐着性一个个点起来到底找到唯一一个暗含字符串(也是唯一会看懂)的方式:

什么是Smali?

先行说Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。虽然Android上的程序是以java来开之,但是Dalvik和正式的java虚拟机JVM还是两回事。Dalvik
VM是冲寄存器的,而JVM是冲栈的;Dalvik有专属的文本实施格式dex(dalvik
executable),而JVM则执行的凡java字节码。Dalvik
VM比JVM速度又快,占用空间还不见。

经Dalvik的字节码我们无能够直接看到本的逻辑代码,这时急需借助如Apktool或dex2jar+jd-gui器来辅助查看。但是,注意的是最后我们修改APK需要操作的文本是.smali文件,而未是传输出来的Java文件又编译(况且这基本上不可能)。

详见的Smali语法学习好参见这篇稿子:http://blog.csdn.net/lpohvbe/article/details/7981386,里面详细介绍了Smali中之数据类型、方法调用等等。

另外,反编译过程中遇不懂得的显要字,可参考http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html,非常实用的文档。

还是是指向认证成功吧的常量定义!可谓一线生机。由代码可以看来这类p中定义了3独常量a,
b, c分别代表LICENSED,
NOT_LICENSEDRETRY。接下来的劳作似乎变得简单了,只要找到引用了LICENSED的地方,那里当来有规范来判定验证结果吗LICENSED还是NOT_LICENSED,修改条件逻辑,让那通进入LICENSED的原则块被即可。
唯独搜索一整个后发觉2单地方引用了LICENSED

怎么去正版验证?

  1. 正如图,类似事先的演绎逻辑,此函数判断变量v0是否和Lcom/android/vending/licensing/p;->a(即LICENSED)相同,从而返回true或false,只要强行修改返回值就推行,很便利的措施:在return v0前插入将v0设为true的语句const/4 v0, 0x1即可

  2. 一般来说图所示,类Lcom/android/vending/licensing/n的函数a()仅仅返回了LICENSED这个引用:

您要之家伙

工欲善其事,必先利其器,反编译工具很多,针对点也不比,本文主要用的凡APKIDE(也给APK改之理,一个像样APK
studio的可视化反编译软件,内部已经合龙了dex转smali、dex转jar、重新编译、签名、搜索等职能,推荐使用),其他工具及职能如下:

apktool,命令行工具,可以decode和build
apk文件,主要为此来解析xml等资源文件。

dex2jar,一多级命令行工具,能以文件于dex、jar和smali之间交互转换,反编译时可以dex转为smali后修改smali代码,再用smali转回成dex。

jd_guid,可视化工具,将jar文件反编译为java代码,便于阅读代码逻辑,至于一直编辑java代码什么的,你想多了。

baksmali,命令行工具,也是故来换dex和smali文件。

apksigner,命令执行签名工具,反编译重新包装之后用来再次签名apk。

apk studio,类似APK IDE,英文界面,有时候会倒编译失败而APK
IDE不会,猜想可能是内嵌的baksmali之类的本子不雷同要编码问题吧。

如上工具在百渡过、谷歌上下载都只是搜到下载。

还好这也只是让搜索变得稍复杂点,只需再找到对这个函数的引用,将相应的条件块进行修改即可。***注意,搜索函数引用时记得查看是否为实现的接口函数。***例如这里的函数a()就是对接口`Lcom/android/vending/licensing/a`的实现。因此需要同时搜索两个函数引用:

常用方法

一般而言不克运作的游艺表现出就几乎种植:

1.
唤起非设置谷歌框架,不可知打;或者提醒谷歌验证此玩耍啊盗版(可能您的apk不是由GooglePlay下载而来)。

2.
提醒当前账号并未购买这玩耍(同样,可能是戏不用GooglePlay上购入后直接下载的)

若打开娱乐或者会见卡在如此的页面:

GooglePlay验证失败页

率先栽状态是盖代码中调用了Google官方的证实SDK,仅验证游戏是否来自GooglePlay,而第二栽补偿加了Google账号验证,检查你是否打了是玩耍,这简单种状态还可由此绕开Google验证来破解:

抹GooglePlay验证(可写成脚论进行自动化破解)

不过简单易行的笔触其实是找到代码中调用验证的地方,将其注释掉,直接调用callback函数(一般此类SDK都是异步返回,开发者实现一个带callback的Listener)中说明成功之不二法门,拷贝复制即可。至于调用的地方,一般都以入口Activity类中,函数称作一般包含verify、certificate、auth之类的字样。这也真是独有效的点子,但因故这艺术破解了几缓缓游戏后意识游戏中差异非常要命,你要对每款游戏去寻觅调用进口,太讨厌了,有无发生规律性的、可自动化的计吗?

答案是必然的,既然是SDK进行的认证,我们仅仅修改SDK内的代码不就是哼了吗?只要说明的结果每次都归成功便OK了。按Google文档上之课程,接入验证使用的凡sdk\extras\google\play_licensing下的sdk工程,引入后即便一个管:com.google.android.vending.licensing,用APK
IDE打开如下:

GooglePlay SDK包结构

彼里面大致做的事务虽是验证apk签名,请求Google服务器检查验证是否经过、并获取游戏之恢宏数据包信息(obb文件称、大小相等),其中鱼龙混杂超时处理、缓存过期岁月等等。

找到了负担征的sdk包,修改哪里就可强制返回成功了啊?一个凡LicenseValidator,负责解析Google服务器返回的responseCode,另一个是贯彻Policy接口的类似,负责解析从服务器获取的额外信息(扩展包文件等)。这里偷了少数疲劳,没仔细研究SDK,而是找到个市场上较好用底安卓破解器:幸运破解器(装于大哥大及便能够直接破解游戏的神器,还会破解内购),用她破解一款游戏后导出apk,反编译出smali文件,写单底论批量对照前后文件变化,过滤掉注释等无用信息得到的虽是我们设改的地方了!总结后如下:

  1. 工中颇具调用java/security/Signature;->verify的地方,将生一行的

move-result v3

改为

const/4 v3, 0x1

move-result
v3的意思是以verify函数的回到结果赋值给v3,我们一直调换成声明一个价值吗true的v3变量即可。verify函数用以证明签名,我们以破解后肯定要再次签名,无法保存原有开发者签名,所以具有证签名的地方还急需开展及时无异于步修改。

2.
实现了Policy接口的近乎(一般是APKExpansionPolicy和ServerManagedPolicy)中的函数allowAccess,将函数开头的宣示

const/4 v1, 0x0

改为

const/4 v1, 0x1

(其中v1命名不确定,可能吃v0或v2等等)此函数根据上次呼吁结果跟重试次数判断是否说明通过,v1凡是默认返回值,初始化时为false,后续代码判断满足某些原则后将v1赋值为true,函数退出时必然返回v1。所以我们用v1默认值设为true就相当给默认验证通过了。

顾,这里恐怕v1默认值已经是true了,而是在认清验证不通过时将v1赋值为false再回来,因此可以以此函数所有的变量声明还转呢默认值为true。

3. smali\com\google\android\vending\licensing\LicenseValidator.smali中的函数verify,将

0x1 -> :sswitch_1

0x2 -> :sswitch_0

改为

0x1 -> :sswitch_0

0x2 -> :sswitch_1

这里是以switch中说明失败的情对了求证成功时若履行的代码段。

4.
为为防万一,可以在此起彼伏了Lcom/google/android/vending/licensing/LicenseCheckerCallback接口的好像中改dontAllow函数,在函数一开始在:

const/16 v1, 0x100

invoke-interface {p0, v1},
Lcom/google/android/vending/licensing/LicenseCheckerCallback;->allow(I)V

return-void

此间的意是直接调用listener的allow函数,p0是callback自己,变量v1声明的初始值为0x100,是意味着成功的常量,调用p0的allow函数,参数为v1,然后径直归,之后的代码就无见面给实践了。这样虽管早晚调用allow,万无一失。

5.
完事以上的步骤就是可由此GooglePlay验证了,但打开游戏后会见开始下载游戏扩大包(obb文件),强制忽略手机及业已存在的obb文件。这是坐健康的sdk在说明的还要会回到此玩耍时的恢宏包名、包大小相等信息,方便用户下载、开发者更新等。因此为了好万事大吉游戏,还要以落实了Lcom/google/android/vending/licensing/Policy接口的切近吃修改getExpansionFileName等一样多元函数,直接将游戏扩大包的消息写在代码中一直归。

好上述步骤即可顺利游戏了,因为这些步骤都是有迹可循、规律的,所以写单剧本就足以一键破解了(脚本正在编制中)。

关于为什么不用破解后底说明sdk直接盖替换其他娱乐的sdk,是以个别打开发时间不同,采用的sdk版本不同,直接盖或会见导致小措施寻找不交,而以上的这些修改都是于sdk核心逻辑中,亲自证实了几乎独版发现这些核心逻辑并从未改动。

可能撞的异常处理

稍微游戏或者在拓展了以上步骤会现出闪退、报错等情形,这或者是由该游戏衔接抱的老三正值工具在兴风作浪。以“拔拔曼陀罗”为条例,本人就上述步骤后报错NullPointer,遂打开Eclipse查找Logcat(不得不说查Logcat是老大实用的章程,只要眼疾手复制出来即可),发现的左如下:

1.
无com.android.vending.CHECK_LICENSE权限错误:游戏中发出只corona的保险,搜索后获悉这是只包插件,方便开发者集成Google、Amazon等sdk、方便build。在Google验证处调用enforceCallingOrSelfPermission时报错,但Manifest中就补偿加斯权限,未找到原因,反正都破解了求证,直接注释掉,运行通过。

2.
空指针报错:同样还是Corona的坑,在收获谷歌框架服务经常未看清null,大概corona的开发者觉得全世界的安卓机都应当生出谷歌框架吧,呵呵,注释后运行成功。

本需要特别处理的地方得会多,并无是有戏还能自动化破解,但产生矣自动化脚本就早已省成千上万工作量了。

那些难以过的坑

  1. 美高梅4688.com代码混淆

模糊后底代码几乎找不交由哪个类下手、从哪个方法入手,因为放眼望去所有类名、方法名全部都是a、b、c。海外市场为时有发生不少娱乐跟应用添加混淆,但迅即吗惟有是“几乎”而已,并无是截然无办法,具体什么破解下同样篇再来论述。

  1. 加壳齐名防反编译措施

再有蛮多种道可以防止apk被反编译,如字符串混淆让反编译后底String类型不可读、用花费指令或动态加载等方法为反编译看不到源码甚至无法反编译源代码。所幸目前看的角落市场游戏于少使此种植艺术,无需对之进行破解。

Lcom/android/vending/licensing/n;->a()      //事实证明并不能搜到这条语句的引用

Lcom/android/vending/licensing/a;->a()

摸结果只有发生同漫漫,在某类中几百推行的函数中引用了Lcom/android/vending/licensing/a;->a()

代码中以cond_9底基准块被判断了p2是否为0,然后跳入不同口径块,只需要用是否为0的论断注释掉:

#if-nez p2, :cond_a

再在函数开始经常就是径直跨越入cond_9(如下图),于是这函数必然会跳入验证结果吗LICENSED的语句。

瞩目:这里的goto语句需要写在变量声明后,否则后面的代码用未经声明的变量会报错Verify
Error。

末,打包、重签、安装、运行,GP上付费购买之游戏吗可以在外手机及圆满运行啦(包括无Google
Play框架手机)! : )
另外,以上逻辑可以生便宜之勾成脚本,全部是文件查找和替换,无非是遍历次数略多,不过当工具脚本,也不必花时间去优化其运作效率了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注