http://www.jianshu.com/p/7436a1a32891“>Android 混淆从入门到精通
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆
public static final Android.os.Parcelable$Creator *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
删除无用的module,lint清理资源文件,删除test模块,减少方法数,multidex最费时。
exclude group: 'com.android.support', module: 'support-v4'
原理是在zip文件的comment中加入渠道号,这样既可以写入渠道号又不会破坏zip的签名,因为apk本身就是一个zip文件,所以这个规则是可靠并完全适用的。
http://geek.csdn.net/news/detail/76488
首先解释什么是comments(注释或评论)的打包方式?
Android应用使用的APK文件就是一个带签名信息的zip文件,根据zip文件格式规范(请参见:https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT),
每个文件的最后都必须有一个叫Central Directory Record
(https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html)的部分,这个CDR的最后部分叫“End of Central Directory Record”,这一部分包含一些元数据,它的末尾是zip文件的注释。注释包含Comment Length和File Comment两个字段。前者表示注释的长度,后者是注释的内容,正确修改这一部分不会对zip文件造成破坏,利用这个字段,我们可以添加一些自定义数据。
简单来说就是:我们利用的是zip文件“可以添加comment(摘要)”的数据结构特点,在文件的末尾写入任意数据,而不用重新解压zip文件(apk文件就是zip文件格式);所以该工具不需要对APK文件解压缩和重新签名即可完成多渠道自动打包,可谓是高效、速度快,无兼容问题。
这种高效的方式是奇虎360的一位工程师公布的,他已经把相关工具的代码开放在GitHub上面了,地址为https://github.com/seven456/MultiChannelPackageTool。工具本身为命令行形式,一条命令即可生成一个多渠道包,并且非常高效。作者本人公布的性能数据是:5M的APK,1秒种能打300个。
可以在下载完了再添加渠道。
把一个Android应用包当作zip文件包进行解压,然后发现在签名生成的目录下添加一个空文件不需要重新签名。利用这个机制,该文件的文件名就是渠道名。这种方式不需要重新签名等步骤,非常高效。
首先把一个已经签名好的Android应用程序包解压缩,签名文件的目录为:META-INF,如图1所示。
分别为:assets目录和META-INF目录
豌豆荚的多渠道打包方案和美团的所用的方式一样,都是添加一个文件,文件本身会带入渠道消息。但不同点在于它添加的是一个不为空的文件。之前已经提到过了,如果添加一个非空文件,就会破坏签名校验,需要重新签名。
加入渠道时主要有以下步骤:
1. 首先需要准备好渠道文件。在Android应用程序包的同级目录,新建一个assets目录,并且在该目录下放入一个channel.txt文件,文件内容是渠道信息,可以是wandoujia或360等。
2. 使用AAPT加入渠道文件:
aapt add wandoujia.apk asserts/channel.txt
3. 在渠道加入后,重新签名APK文件并且进行对齐。
重新签名相关的步骤就不再介绍了,如果感兴趣的话,推荐看一下calabash-android这个开源项目的resign相关部分实现,calabash的重新签名实现是我见过最严谨的。
在介绍篡改渠道之前,还是先简单介绍AAPT这个工具的一般使用方法。在AndroidSDK的build-tools中。
* 查看Android开发包的基本信息,例如:包名、版本等。以微信的Android版本为例:
```
'' INPUT apt dump badging weixin.apk
'' OUTPUT package: name='com.tencent.mm' versionCode='740' versionName='6.3.13.49_r4080b63'
'' uses-permission:'com.tencent.mm.plugin.permission.READ'
'' uses-permission:'com.tencent.mm.plugin.permission.WRITE'
'' uses-permission:'com.tencent.mm.permission.MM_MESSAGE'
'' uses-permission:'com.huawei.authentication.HW_ACCESS_AUTH_SERVICE'
'' sdkVersion:'15'
'' targetSdkVersion:'23'
'' uses-feature-not-required:'android.hardware.camera'
'' uses-feature-not-required:'android.hardware.camera.autofocus'
'' uses-feature-not-required:'android.hardware.bluetooth'
'' uses-feature-not-required:'android.hardware.location'
'' uses-feature-not-required:'android.hardware.location.gps'
'' uses-feature-not-required:'android.hardware.location.network'
'' uses-feature-not-required:'android.hardware.microphone'
'' uses-feature-not-required:'android.hardware.telephony'
'' uses-feature-not-required:'android.hardware.touchscreen'
'' uses-feature-not-required:'android.hardware.wifi'
'' uses-permission:'android.permission.ACCESS_NETWORK_STATE'
'' uses-permission:'android.permission.ACCESS_COARSE_LOCATION'
'' uses-permission:'android.permission.ACCESS_FINE_LOCATION'
'' uses-permission:'android.permission.CAMERA'
'' .....
```
* 使用AAPT查看Android开发包的目录结构如下:
'' INPUT aapt list weixin.apk
'' OUTPUT META-INF/MANIFEST.MF
'' META-INF/COM_TENC.SF
'' META-INF/COM_TENC.RSA
'' assets/jsapi/wxjs.js
'' assets/avatar/default_nor_avatar.png
'' assets/avatar/default_meishiapp.png
'' assets/avatar/default_hd_avatar.png
'' assets/ipcall_country_code.txt
'' assets/merged_features.xml
'' assets/address
'' .....
* 使用AAPT添加一个文件:
'' INPUT aapt add wandoujia.apk assets/channel.txt
* 使用AAPT删除一个文件
'' INPUT aapt remove wandoujia.apk assets/channel.txt
在掌握了以上简单的四个命令行后,修改美团的渠道就已经非常简单了。先通过list命令找到渠道文件,然后直接删除文件,最后再加入自己的恶意渠道。但豌豆荚的渠道也可以通过相同的方式来进行篡改,但篡改之后需要重新签名。在没有官方的签名文件时,是没有办法完全伪造一个相同的签名的。
添加comments多渠道打包方式中虽然渠道信息不是明文显示,但也存在着被篡改的可能性。如果自己进行一些简单的加密可以杜绝大多数的恶意篡改,但由于不需要重新签名,这种方法还是存在着被篡改的机率的。
具体选择哪一种多渠道打包方式,还是由业务决定的。豌豆荚作为一个应用商店,需要有自己的渠道,渠道的安全性会很不好。如果是一个普通的App,一般都是在一些应用商店上发布新版本,应用商店本身会给开发者提供相对安全的环境。所以这也就是美团方案依然能够使用的关键。
美团Android自动化之旅—生成渠道包