本教程通过实战的方式详细分析赋值VIP的原理,让你更深刻的了解赋值VIP的原理,从而遇到各种各样的软件都可以自行分析并解锁。

通过本教程的学习可以达到以下目标:
1.明白赋值VIP是什么
2.了解赋值VIP的原理
3.通过赋值VIP的方式解锁会员
二、赋值VIP是什么
赋值VIP,顾名思义就是通过反编译的方式给软件获取VIP开通状态的方法赋一个返回为true(真)的值,从而使软件直接显示为已获取VIP并可以使用VIP全部特权。
三、赋值VIP的原理
赋值VIP的原理非常简单,熟悉移动开发的人都知道,安卓软件有一种类叫实体类,它和数据库里的表结构一一对应,表的字段对应实体类的属性,实体类会对每个属性生成getter/setter方法,而这里的getter方法就是赋值VIP的关键,因为软件的数据库里肯定有一个用户表,这个表里存储的都是用户的信息,其中就有一个vip字段,该字段一般都是布尔类型,为true时代表已开通VIP,为false时代表未开通VIP。实体类里肯定也有一个叫vip(属性名不唯一)的属性和isVip(方法名不唯一)的方法,这个isVip方法就是用来判断当前用户是否已开通VIP的,讲到这里相信你们已经有思路了,当我要使用赋值VIP的方式来解锁软件时,就可以从isVip方法下手,直接让isVip方法返回true即可,那么怎么让isVip返回true呢?下面我将以实战的方式告诉你。
四、通过赋值VIP的方式解锁软件
在了解了以上知识点后我们就可以进入实战环节了。我将采用详细分析的方式来给大家讲一下通过赋值VIP方式解锁一款软件的整个流程,让大家对赋值VIP有更深的理解,从而遇到各种各样的软件都可以自行分析并进行解锁。本次实战的软件是小熊录屏。
首先,我们从应用商店下载小熊录屏:

打开MT管理器并找到软件安装包:

因为软件的核心代码都在dex文件里,而该软件有多个dex文件,我们不知道用户实体类具体在哪一个里面,所以全选该软件的dex文件:

前面我们说过软件会有一个用户实体类,里面存储了用户的信息,当然也包含了vip信息。因为小熊录屏的代码被混淆过,所以不能直接通过搜索User类的方式来进行赋值。所以这里直接搜索isVip代码:
得到如下结果:

点开第一个co2类(这里的类名被混淆了,点开后可以看到真实的类名):

通过第5行代码得知该类的真实类名是UserInfo,说明这个类确实是用户实体类,那里面到底有没有vip字段呢,我们将这个类转成Java看一下(我个人喜欢转成Java,不转也可以):

可以看到d属性的真实属性名是isVip,一般情况下该类都会有一个isVip方法,但是因为该软件的设计原因并没有为我们生成isVip方法,所以我们不能直接在这里进行赋值。
那我们看一下fj1类里面都有啥:

该类里面的代码比较多,但是不用慌,我们直接找关键字:isVip,可以看到第13行代码有isVip字符串,这里我解释一下第13行代码的意思。
这行代码的意思是将hm3类里的h方法返回的值(如果返回true则为0,返回false则为1)以键名为isVip的方式存储到bundle对象里。其实这里的hm3.h()就是获取vip是否开通的关键方法,回到smali代码:

第37行代码表示调用了hm3类的h方法,长按跳转并转为Java:

可以看到h方法(第45行)返回的是mm3.f方法返回的结果,那么我们继续跳转到mm3.f里去:

根据上述分析,继续跳转um3.p:

继续跳转tm3.D(context).K :

继续跳转m方法:

m方法调用了该类里面的r方法来获取布尔类型(boolean)的值并返回,该类的r方法其实返回的就是一个SharedPreferences对象而已,所以从这里就可以看出该软件的VIP开通状态是存放在本地的,想深入了解的可以百度看一下SharedPreferences类的用法。那么m方法其实就是获取本地的vip状态来返回给该方法的调用方,那找到了关键方法就可以开始赋值了。
回到smali代码:

通过对上图的分析可以发现131行代码就是m方法返回的关键代码,它返回了p1,那我们就可以在它的上方进行赋值,直接让该方法返回true,如下:

选中的代码是我对该方法进行赋值的代码,注意这里的p1,它是不唯一的,每个软件都不一样,所以解锁其他软件时需要自行分析并替换。
这行代码的意思是给p1赋值0x1,0x1其实就是1,而1又表示true,所以这里就直接让该方法返回true了,不信我们转为Java看一下:

注意,转为Java后需要重新加载一下才能看到修改后的变化。
可以看到m方法已经直接返回true了,这代表凡是调用该方法以及上层方法的方法都会返回true,也就是说不管怎么样vip状态都是已开通状态。
下面我们来看效果图:

可以发现已经显示vip标识了,这时候所有vip相关的功能都可以免费使用了。
暂无评论内容