安卓软件验证破解技术教程
作者:傲世V雄哥720
首发:吾爱破解论坛
/* * 作者:傲世V雄哥720 * QQ:737672679 * (欢迎交流,若论坛想抹去我的Q号,请把帖子也删了,谢谢合作。) * 写作时间:2016/10/2 20:25 * */
很早就开始在搞安卓 apk 应用程序 VIP 权限破解、软件功能改变实现,游戏的短代等内购、
垃圾软件的去广告操作,也算是积累了一定的逆向经验,今天分享一些经验,也算是对以前的逆向经验的总结。
关于校验
从 2014 年起,安卓程序的篡改就从安卓市场上肆虐开来,去年开始,在国内安卓 apk
安全攻防趋于白热化,加固暂且不说,越来越多的自身校验开始呈现在破解者眼
前,综合考虑,我一般把程序校验分为三大类:
1.签名信息的检验。这种最为常见,可以说是开发者最起码的安全防范意识。由于开发者的
层次不同,签名校验的逻辑有写在 Java 层,也有写在 so 里的。比如,瓦力抢红包的签名校
验,包括获取签名信息的过程和判断逻辑都在 Java 层,在 Smali 代码中定位搜索的关键词
为:Landroid/content/pm/PackageInfo;->signatures:(搜索结果中选择在程序包名程序内的
结果)。
这种的 smali 中的破解不是障碍,怎么都行,可能是爆破,也可能是直接赋予正确的签名信
息。
如果签名信息的获取和判断都是在 so 里,就相对有些难度了,比如饥饿鲨·进化那款游戏,
签名信息的校验就是在 so 中,将 so 拖进 IDA,不懂的先看IDA权威指南,Shift+F12,在所有的 Strings 中查找 signatures字符:
查看知:thread fun+2E 则是 checkdex 的地方:
所以破解的手段可以是直接 nop 掉校验方法对 ExitGame 方法的调用。
还有一种混合层次写法:在 so 中获取签名信息返回到 Java 层进行判断,我不知道这有何意
义 。目前来看 ,由于很多程序获取签名信息的方式大抵都是
getPackageManager->getPackageName->getPackageInfo->signature 的
byte/charString/MD5/HASH,基于 Java 可继承的特点,基本都没啥难度,最重要的还是定
位 apk 的路径,自定义获取 RSA 的信息,这样破解者就难以捉摸了。
2.文件校验。文件校验的范围就比较大了,包含 classes.dex、AndroidManifest.xml、unity.dll、
so、apk 整体的校验等,按照一般的逻辑,要想对这些文件进行合法性的校验,首先要定位
到这些文件,需要用到的关键词有 sourceDir、getPackageCode、getPackResPath 等,比如
饥饿鲨进化游戏中对 classes.dex 文件校验时,就会通过 sourceDir 定位:
其实这个 sourceDir 也可以通过 Java 反射进行 set 固定,这样也可以实现不修改 so 进行路
径转向。
3.服务器校验签名或文件信息。所谓的服务器校验就是将需要检验的信息在本地获取后拿到
服务器上进行判断是否合法,比如本地获取运行签名信息或者 apk 整体 MD5,发送到服务
器进行判断。比较简单的情况是传入固定值,意思是因为一个 apk 签名、MD5 一定时固定
的,那向服务器发送固定值也是可以判断的,这种最简单,找准位置让它传正确的不就行了。
有一种比较难的是,有一个 native String vialSign(String Str)方法来获取要传送的校验值,
其中传入和传出都是变化的 ,深层次的来说就必须要了解 so 中的算法机制才能进行伪造,
或者可以测试下,当传入一个定值时,返回值是否也是固定,如此就可只固定传入值即可绕
过。
关于破解 VIP
VIP 功能在本地的就不用说了,实现会员Boolean判断为真,解除限制即可。例,麦格期刊smali:
const/4 v1 1 //判断v1的值是1 true if-ne v1 v2 :label_9 //删除此跳转达到VIP功能 const-string v0 "supervip" //超级会员 invoke-static {v0,v1} Lcom/magook/f/u;->b(Ljava/lang/String;Z)V label_8: return-void label_9: const-string v0 "supervip" const/4 v1 0 //判断v1的值为0 false //可以将 v1 0 改为v1 1 invoke-static {v0,v1} Lcom/magook/f/u;->b(Ljava/lang/String;Z)V goto :label_8
const-string v0 "supervip" const/4 v1 0 invoke-static {v0,v1} Lcom/magook/f/u;->a(Ljava/lang/String;Z)Ljava/lang/Boolean; move-result-object v0 invoke-virtual {v0} Ljava/lang/Boolean;->booleanValue()Z //booleanValue的值为1或0 move-result v0 //将结果返回给 v0 const/4 v0 1 //此处将BooleanValue值修改为1,真。 return v0
VIP 功能在服务端的破解,无非就是两种途径:一是在用户请求时 VIP 资源已经自动下载到
了本地,只在本地进行限制,此时修改客户端接触本地限制即可;二是该应用服务器端存在
越权或者封包可伪造请求漏洞,可以越权访问或者伪造请求获取 VIP 资源,从而在本地展示。
关于去广告
去广告应该算是所有应用修改中最简单的,因为所有的广告之所以为广告不就是在本地进行
展示的吗,而本地的破解是比较简单的,无非就是一些布局文件 XML,是否显示 show(),哪
些组件不可见 gone/invisible,倒计时为 0、修改广告的请求地址,修改服务器返回的广告 url
获取关键词等等。
然后说一下去除升级,简单的两个途径:一修改版本 Versionnam 和 versionCode;二是根
本办法修改 update 的 URL,抓包找到URL,去除或者修改该链接。
本文结束。