Android手机端破解神器MT的内购VIP功能破解教程
一、前言在破解app的时候,我们现在几乎都是在PC端进行操作,但是之前bin神的MT管理器,可以在手机端直接破解,不过也有很大的局限性,但是对于一些简单的app破解没问题的。这个工具其实原理也很简单,就是解析apk中的dex,arsc等文件,然后支持修改其中的类方法信息和资源信息,然后在二次打包签名即可。其实把这部分功能移到了移动端做了,不过值得佩服的是这个app从整体效果来说,非常的赞,非常佩服这个工具的作者。二、逆向分析但是今天我们的主题是破解这个工具内部的收费功能,而用这个工具进行破解教程后续再给出文章,今天我们就来爆破这个app的收费功能。不多说了,直接上图:
http://img.blog.csdn.net/20171029142614837?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
我们在查看arsc文件的一部分功能的时候,就出现这个提示了,好的,直接用这个提示信息作为突破口,使用apktool工具反编译apk,然后查看他的string.xml文件:
http://img.blog.csdn.net/20171029142722071?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
看到这里,就很懵逼了,而且你会发现apk内部的所有资源都是这种格式定义,到这里可以猜想apk做了资源混淆,我们用Jadx打开apk之后,全局搜索这个name值,是找不到的,会发现全是R.xxx.MT_Bin这样的定义,所以这个作者是为了防护apk做的一种策略。不过不要紧更恶心的防护还在后面。看我分析再说。不过在怎么资源混淆,最终在smali代码中都必须用int值0x7FXXXX来进行操作,所以我们可以在smali代码目录下全局搜索包含0x7f08009e值的文件,这里需要借助Window中的命令findstr了:
http://img.blog.csdn.net/20171029143231784?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
命令很简单,在当前目录下查找所有文件中包含指定字符串内容的:findstr /s /i "需要查找的内容" *.*我们可以看到总共就这么几个文件,这里我不会对每个文件进行查找,然后在确定是否是这个文件了,大家自己操作,可以依次顺序进行查看定位即可。最终我定位到了0oO00OO.8.smali这个文件。我们打开这个文件查看:
http://img.blog.csdn.net/20171029143448945?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
记住在代码的157行调用这个字符串信息了,然后我们在Jadx中进行类查找即可:
http://img.blog.csdn.net/20171029143547427?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
查找之后又开始懵逼了,这是他的第二次防护代码混淆,你看这些类名被高度混淆了,不过有个规律,就是都是C开头,然后是4位的数字,后面就是正确的类名。所以后面查找类都要记住这个规则即可。因为Jadx在查找类名不区分字符大小写,这里通过观察,可以确定是第一个,我们点击进入即可:
http://img.blog.csdn.net/20171029144210420?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
这里看到,正好是我们想要找的地方,看之前收费的功能截图:
http://img.blog.csdn.net/20171029144243266?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
就是资源查询功能需要收费。所以到这里,我们的入口就定位正确了,接下来就开始跟踪分析代码即可。不过这里有同学会问,上面那几个找到的文件,怎么就能定位到这个入口文件呢?还是那句话。可以依次对每个smali代码进行分析,还有一个办法就是在每个类中用到的提示信息地方进行hook,然后操作一下,看看哪个类中打印了,就表示哪个类是正确的。这个是逆向的一点经验。
接着上面的入口继续跟踪代码分析:
http://img.blog.csdn.net/20171029144600516?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
先不管这个判断,后面再分析,看看这个提示信息逻辑:
http://img.blog.csdn.net/20171029144710476?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
继续查看:
http://img.blog.csdn.net/20171029144719823?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
看到了,这里就是用了toast进行提示的,符合我们看到的效果了。下面就来看看这个判断了:
http://img.blog.csdn.net/20171029144832084?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
通过这里大致分析到,这个类管理了一个用户的付费功能的有效期。后面还需要用到这个类,先不管,我们直接用Xposed把这个方法强制返回true即可:
http://img.blog.csdn.net/20171029145353132?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
这里hook的时候,一定要注意类名正确,这个规则之前已经说过了,除去Jadx中显示类名的Cxxxx后面就是正确的类名了:C2789oOo0oo0o==》oOo0oo0o;就是这样的规则。记住后面hook都是这么干的。
继续往下看。我们既然hook了这个方法返回true了,那么代码就不走提示信息了,就往下面走:
http://img.blog.csdn.net/20171029150409845?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
这里会发现又有很多判断分析,主要是判断系统版本,然后就还是上面提到的那个类,判断用户是否为会员,可以进入查看代码:
http://img.blog.csdn.net/20171029150508477?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
这两个方法看到和时间有关,说明这里应该和用户是否为会员到期功能有关,先不管,直接把这两个方法进行hook,修改返回值为true即可:
http://img.blog.csdn.net/20171029150600003?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
不过,既然设计到了会员到期问题,继续查看这个到期时间在哪里设置的:
http://img.blog.csdn.net/20171029150638287?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
我们拦截这个类的方法,把时间改成永久会员:
http://img.blog.csdn.net/20171029150716039?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
然后我们查看个人中心信息:
http://img.blog.csdn.net/20171029150910650?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
修改成功了,我们继续查看改成永久会员之后的后面判断:
http://img.blog.csdn.net/20171029150943385?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
这里通过系统版本来判断高版本中运行时的一些权限是否开启,如果没有开启,那么功能也是用不了的,这里我用的4.4系统,所以这一层判断对我没什么影响。直接往下看:
http://img.blog.csdn.net/20171029151201481?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
继续点击进入代码查看:
http://img.blog.csdn.net/20171029151331621?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
通过跟踪代码发现,o是个接口类型,看他赋值的地方是在构造方法中,那么全局查找C05320oO00OO这个类用到的地方:
http://img.blog.csdn.net/20171029151529554?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
通过分析,可以确定是最后一条信息,点击进入即可:
http://img.blog.csdn.net/20171029151606810?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
再次确认是这里,我们正好是处理arsc文件的。然后全局搜索看看这个类方法在哪里调用的:
http://img.blog.csdn.net/20171029155527236?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
分析之后,在这个类中调用了:
http://img.blog.csdn.net/20171029155552156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
查看这个类的方法:
http://img.blog.csdn.net/20171029155611519?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
最终会调用传入进来的这个类的o方法,我们回到最开始处:
http://img.blog.csdn.net/20171029162014143?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
进入继续查看代码:
http://img.blog.csdn.net/20171029162038136?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
这里就有点问题了,使用工具还是出现错误提示:
http://img.blog.csdn.net/20171029162238382?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
而这个o方法分析非常麻烦,非常深入,也同时hook了下面的类的run方法:
http://img.blog.csdn.net/20171029162325681?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
也并没有执行,所以问题就出在这个o方法了,而我们可以看到这里有一个try.catch,并且会打印异常信息,所以我们可以通过日志分析,直接过滤System.err即可:
http://img.blog.csdn.net/20171029162418883?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
果然不出所料,这里有崩溃栈信息就好办了,直接跟踪查看:
http://img.blog.csdn.net/20171029162603181?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
这里看到,有一个判断,如果是0就正确走逻辑了,那么简单,继续hook这个方法,让其返回0即可:
http://img.blog.csdn.net/20171029162827582?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
不过可惜的是,运行还是有问题:
http://img.blog.csdn.net/20171029163657695?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
依然查看System.err日志信息:
http://img.blog.csdn.net/20171029163703221?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
直接根据堆栈信息跟踪代码:
http://img.blog.csdn.net/20171029163721212?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
在往上看调用代码:
http://img.blog.csdn.net/20171030102659634?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
发现崩溃日志就从这里开始的,上面我们hook了o方法,让其返回0,走到内部逻辑了,但是没想到内部却又有崩溃信息,我们为了更好的查看崩溃原因,我们hook这个o方法,把参数字节数组和返回值字节数组打印出来看结果:
http://img.blog.csdn.net/20171030110804038?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
运行Xposed模块,查看日志:
http://img.blog.csdn.net/20171030110907610?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
看到了,这里的值返回为null值,所以上面报了异常信息了。继续往上看代码,看看这个字节数组怎么传入的:
http://img.blog.csdn.net/20171030113016317?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
看到这里发现,工具做了第三层防护,就是app内部所有的网络请求都采用Socket,防止被轻易抓包破解。可以看到这个工具作者安全防护意识非常强,后面还要介绍第四层防护。因为采用Socket请求,一般抓包工具很难抓到数据了,我们先hook这o方法,打印Socket请求的ip地址和端口号信息:
http://img.blog.csdn.net/20171030113222989?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
然后,我们在去使用那个收费功能,打印日志:
http://img.blog.csdn.net/20171030113244392?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
发现了这个ip地址,对应的域名是binmt.cc了,为了能够抓到数据包,我们用Wireshark工具进行操作,关于如何使用这个工具抓取手机数据包,不了解的同学可以看这篇文章:Wireshark和Fiddler抓取设备数据包分析;我们过滤一下ip地址看看结果:
http://img.blog.csdn.net/20171030113438998?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
结果也是看到,他用了SSL加密数据了,而从上面日志打印看,也是没有数据的,因为返回的字节数组都是null了。而且返回的数据,我们在跟踪本地代码发现,会先进行解压操作:
http://img.blog.csdn.net/20171030112958631?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
然后开始进行数据校验:
http://img.blog.csdn.net/20171030113007373?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
看到整个过程全部用DataInputStream类进行操作,也就是纯的字节操作。对应破解看数据增加了非常大的难度。到这里也是没辙了,原因很简单,首先我们因为没有购买会员,所以服务端返回的数据肯定是不正确的。那么首先我们应该获取争取的服务端数据,然后替换上面的返回字节数据的方法返回值即可。
三、破解方案到这里,有些同学就困惑了之前说过,任何工具类的app只要收费那么理论上都是可以破解的,因为工具的功能是在本地,服务端和本地再怎么验证都是一个开关而已。但是通过这个app发现,这个开关太多了,他把本地端这个收费功能用服务端的一些字节数据控制,又加上代码资源高度混淆。几乎很难在往下走了。所以这里想到另外一个方法,我们可以先去用一个账户买个会员,然后使用收费功能,通过hook那个返回字节数组的方法,打印信息,把返回的字节数组保存:
http://img.blog.csdn.net/20171030151418421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
然后我们hook之前的那个o方法,返回这个固定的字节数组:
http://img.blog.csdn.net/20171030151546538?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
就这样,我们在运行就可以免费使用了,不过有的同学就觉得很奇怪了,这不是付费了吗?当然能用了,的确,我们付费买了一个会员,但是有了这个正确的字节数组之后,我们只要hook操作,所有的账户或者无登录状态都可以使用,这样就等于买了一次,每个人都可以使用了。的确是花了一份钱,但是给大家所有人都带来福利了。为什么这么说,因为我们回过头来看,我们hook了哪些地方?第一个地方:拦截修改了用户是否已经登录第二个地方:拦截了用户是否为会员记录第三个地方:拦截了服务端返回的付费功能字节数组有了这三个地方我们就可以在无登录状态,利用那一份付费的字节数组让每个人都用上了付费功能。下面来看一下,我没有登录也能是用这个收费功能效果:
http://img.blog.csdn.net/20171031111435408?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
看到了,左上角的登录状态是无登录状态,但是依然用到了收费的资源id查找功能。不管怎么样,目的是做到了,但是到现在还有两个问题:第一个问题:大家看到了,这个工具的作者是多么的牛逼,把代码资源混淆成这屎样,还防止抓包用socket通信,返回全是字节数组,每个字节控制付费功能的逻辑。后续逻辑没法分析。导致需要花一份冤枉钱,心里还是很不爽的。第二个问题:大家看到我本文全程都在用Xposed进行hook修改的,而实际一点应该是改smali代码,二次打包这样才能真正的造福大家,给大家一个真正的免费版MT工具,这就要引出作者的第四层防护了,就是防止二次打包签名,当然是用了kstools工具了,二次打包运行的确没有崩溃了,但是出现了ANR了,签名验证逻辑在so的start函数中。这个后面会单独讲他的验证逻辑,因为篇幅太长了。
四、技术知识因为上面混淆的太多导致追踪代码太多,可能大家看的头都晕了,其实分析起来更是头晕,大家可以用样本自己分析一下就知道了。不过这里还是总结一下本文破解之后,我们掌握了什么知识点:安全防护策略方面:通过本文的几层安全防护可以学习借鉴一下工具的策略,这个工具可以作为一个安全防护研究的非常好的案例样本,很多安全防护技术值得研究学习的。
[*]1、代码资源的高度混淆还是值得做的,关于本文中的代码混淆,可以看出有一定规律,就是混淆后的类前缀都是C开头然后是4位整数然后就是正确的类名了,其实这个可以用我之前介绍混淆工具改一下就可以做到。将类名变量名方法名混淆成自己定义的格式即可,网上也有这个技术,可以自行搜索。代码混淆可以看到,在Jadx中的代码跟踪技术就丧失了,只能完全靠搜索功能了定位代码了。
[*]2、资源混淆的高度混淆还是值得做的,关于本文的资源混淆,之前很多app都做了,主要是腾讯的资源混淆工具叫做AndResGuard,其实当初这个工具的初衷是为了减少应用包apk的大小的。没想到也能做到混淆防护功能。这么做之后会发现我们用以往的字符串找突破口技术就失效了,不过我们依然可以用全局搜索功能来进行查找突破口,只是花费的时间长了而已。
[*]3、依然是签名校验,防止二次打包,本文篇幅原因,二次打包技术问题就等后面再分析,但是可以看出他也用到了比对签名信息的功能,只不过还有其他比对技术了。所以签名比对有很多技术来实现了,导致我的kstools工具失效,这时候就需要具体问题具体分析了。
[*]4、为了防止被恶意抓包,应用中所有网络请求使用socket进行加密通信,这个对于分析来说就加大难度了,因为socket通信,涉及到的一般都是纯字节数组,这个对于分析来说非常难受的。
破解爆破策略方面:不管这个工具的安全防护做的如此坚固,但是我们最终还是找到了核心点,原因在于坚持不懈,相信一点,工具app他不像一些视频VIP功能,收费功能都在服务端控制,比如视频VIP功能,只有你付费了,服务端才会吐给你视频链接,这都是服务端做的事,而工具一般功能都是在本地写死了,只是服务端有一个开关而已。所以坚信这一点,工具类app收费功能是肯定可以破解的。只是看这个开关的破解难度了,比如本文,为了防止抓包,尽然全程用了加密socket进行通信,通信中的字节很多都用于开关控制,导致分析难度非常大。所以本文最后就花了一份会员的钱,来搞定每个人的永久免费功能。而对于此工具其实算是防护的一个漏洞,就是虽然作者把功能开关弄到服务端,用socket加密字节数组操作,但是并没有携带用户相关信息,看上面的效果可以知道,我没有登录都可以使用该功能了。工具应该把用户登录状态信息也做一次服务端验证。
严重声明:本文的目的只有一个,利用样本案例分析讲解更多的逆向技术和知识,如果有人以非法目的利用本文技术谋取利益,带来一切法律责任都将由操作者承担,与本文作者无关。由衷的希望读者以学习逆向知识阅读此文。介于安全问题,本文涉及到的样本和代码都放在编码美丽技术圈中,需要进圈获取即可。
MT管理器作者已经进入编码美丽技术圈了,分享了很多实用的技术,赶紧进来一睹大神风采
http://img.blog.csdn.net/20171105125123373?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
五、总结本文分析了这个工具的之前几个版本,发现作者对于安全防护做的非常用心,而且这个作者本身真的很牛逼,开发出这么一个厉害的工具,可以在设备端直接破解简单的应用。这个不得不佩服。后续会继续介绍用这个工具如何在设备端直接破解app的功能。有的同学会好奇?既然做了这么多层安全,为何不在最外一层进行加固,其实说到加固,大家应该都知道了,加固厂商都不能保证加固之后的崩溃率是0,而且工具类app崩溃率或许更高,我猜作者是想这个工具的用户基数算比较大了,而且更新也很快,一旦发现有安全问题就立即更新,不想因为安全问题带来崩溃反馈就得不偿失了,而一般现在加固厂商企业版都是收费的,费用也不便宜,作者也不想花这个钱,免费版加固其实就是一个魔术,大家都是这个魔术的原理,那就不是魔术了。加固技术一旦被解决了。一样不安全了。 厉害啊,膜拜 你倒是重新打包一个哎 有点讽刺,我为了破解软件,买了破解软件的工具的会员。。。129.还是有点心疼的 厉害了我的哥,虽然看不懂{:1_912:} 大神,膜拜一下。虽然看不懂。 哇,膜拜,虽然看不懂个,就是觉得好牛啊
过来学习一下 值得学习 值得学习,过程很详细 大神,膜拜一下。虽然看不懂。 虽然看不懂 支持一个