APK混淆及360加固

1,018 阅读4分钟

这又是一期奇奇怪怪的Bug

起因

本来不想甩锅的,但感觉还是要把事情讲解清楚,我可不能背锅。

九月份入职新公司,一下子接手六个项目,其中还分海内外啦,马甲包(假的马甲包,实际上就是App的壳加上H5),还有360加固,业务理解之类的,但交接时间只有两个星期。

事由

公司决定在原有APP的基础上修改一下开发新的平台,遂开始深入接触项目A。在build.gradle文件中发现release版本未混淆minifyEnabled false,当时还觉得奇怪,难不成线上的版本是没有混淆的?

爆发

项目准备发布了,和项目经理沟通了,混淆加固一套走起--然后就爆炸了。先是360加固通过不了

align error 签名失败:请检查您的APK是否正确

包括签名和加固都失败,更甚的是,加固的错误提示都是空的。经过项目经理(有5年Android开发经验的大佬,现在不开发了,主管技术部门)一个小时的努力,遂决定,不加固了,就混淆。然后更悲伤的是,发现一旦混淆,接口直接爆炸,或者更加准确的说,接口请求后的数据一直是空的。

怪不得不把混淆开关打开。

大佬看了我的(现在是我的项目了,不是上一个开发的项目,毕竟现在我负责),鄙夷说我的混淆文档就是太差劲了,把他的混淆文档复制过来,结果,接口有数据,但json没办法转换成model。忙活到接近十点半,最后他决定,既不加固,也不混淆,反正这个APP的代码也没什么重要的秘密(这是大佬的原话)。

本以为这就结束了,结果第二天上班后叫我处理这两个问题(混淆+加固)

这感觉已经超出了自己的能力范围了

还好我加了上一个开发的微信,当初他离职的时候也没有和我说这个坑,我得找他仔细闻讯一下,结果。。。他把我的微信删了。

寻找解决方案

具体问题

处理问题的第一步,便是找到具体的问题

当初大佬和我提到过,接口有请求,也有返回,但是返回后的数据不和View联动,可能是Fragment或者Activity被混淆了。

这是一个思路,于是去找文档,但自己心里也没什么准头,混淆这东西,都是拿过来用的,而且还和网络请求框架一样,一次配置,终生使用。

ProGuard代码混淆技术详解 www.cnblogs.com/cr330326/p/…

这篇文章讲得非常细节,当然初学者可以先看看郭霖大神的混淆两部曲Android安全攻防战,反编译与混淆技术完全解析(上)Android安全攻防战,反编译与混淆技术完全解析(下)

然后运行项目,发现仍然没有解决问题,请求和返回的接口都是有数据的,但是,就是没办法把数据设置在界面上。疑惑。

打个断点吧,APP直接崩溃(不知道是不是因为是release和混淆的缘故),那就用Log打印信息吧。

结果发现,数据请求完毕后在P中没办法获取到model,xxModel = null。

因为xxModel = null,所以界面不是设置不了,而是没有设置。

在混淆规则文件中加入model类

-keep public class com.example.test.model.** {*;}

还是失败,获取的model仍然为空。

会不会是整个网络请求框架都被混淆了,或者再细一点,适配器被混淆了,导致没办法将获取到的请求数据转换成model。

遂将整个网络请求框架都加入混淆文件

-keep public class com.example.common.net.** {*;}

终于成功了。

接着是360加固了。

这个就更加简单了,相比较混淆花了一天,加固的问题只花了一个小时。

bbs.360.cn/thread-1592…

这篇文章中提到,签名失败的话,可以试着把 minSdkVersion 设置成23或者以下的

image.png

想来这可能是360加固的一个小bug吧。

总结

没什么抱怨的,当初接手项目的时候不仔细,不能怪别人没有把项目的细节告知。而且,相比较抱怨他人,更应该做的是把问题解决了。

处理这两个问题,花费了我两天时间,但是当初的时候,我根本没想到自己能解决这个问题的——虽然我也有了解过混淆机制,有看过几篇混淆相关的文章,但总是云里雾里的。

结果经过这么一次的尝试,发现,其实混淆也不是那么难,而且自己也可以像技术经理那样,整理出一份独属于自己的混淆文件,把文件整理的规范点。