android应用版本在发布时,为了防止反编译,需要对应用加固,目前常用的反编译工具为:
1、apktool
主要用于资源文件的获取, 常用的为:java -jar apktool_2.4.0.jar d app-debug.apk -o dir
2、dex2jar
将apk中的dex文件编译成jar文件。常用的为:d2j-dex2jar.bat app-debug.apk -o app-debug.jar
3、jd-gui
查看反编译后的jar中的class
4、jadx
直接查看资源与代码
5、enjarify
将apk反编译成java源码 如:enjarify *.apk -o out.jar
由于那么多的反编译工具, 结合目前情况, 我总结apk加固的策略, 本人对于apk加固的重点在两个放的,第一 、Proguard 配置 第二、dex加密
Proguard的使用与配置
Proguard是一个代码优化和混淆工具。能够提供对Java类文件的压缩、优化、混淆,和预校验。压缩的步骤是检测并移除未使用的类、字段、方法和属性。优化的步骤是分析和优化方法的字节码。混淆的步骤是使用短的毫无意义的名称重命名剩余的类、字段和方法。压缩、优化、混淆使得代码更小,更高效。、
在项目中开启Proguard.在gradle中设置为
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
下面是Proguard 一些配置:
-keep 指定类和类成员(变量和方法)不被混淆。
-keep class com.dongnao.proxy.guard.test.Bug
(保护了类名)
-keep class com.dongnao.proxy.guard.test.Bug{
public static void *();
}
(保护了 public static void的没有参数的函数)
-keep class com.dongnao.proxy.guard.test.Bug{
*;
}
(保护所有)
-keepclassmembers 指定类成员不被混淆(就是-keep的缩小版,不管类名了)。
-keepclassmembers
class com.dongnao.proxy.guard.test.Bug
(都被混淆了)
-keepclasseswithmembers 指定类和类成员不被混淆,前提是指定的类成员存在。
-keepclasseswithmembers class com.dongnao.proxy.guard.test.Bug
(保护类名,但是没指定成员,所以函数名被混淆)
-keepclasseswithmembers class com.dongnao.proxy.guard.test.Bug{
native
}
dex加密
在考虑到app逆向问题dex加密处理是非常有必要的, 那么dex采用什么方式加密,加密之后怎么样打包在apk里, apk怎么样解析dex等一系列问题, 首先dex加密方式, 我这里采用AES,. 第二dex在什么时候加密, 加密如何打包进apk呢,要想解决这问题,就需要了解一下Dex文件加载过程: