Android代码混淆与反编译
2018-02-05 13:22
281 查看
1.混淆的目的
用于保护APP不被破解和逆向分析。2.混淆的意义
proguard通过移除没有用到的代码以及通过特定规则重命名类、变量、方法来压缩、优化、混淆你的代码。这样做可以让你的apk更小,更难被逆向分析。由于可以提高被逆向分析的难度,对相关功能安全敏感的应用使用它是十分必要的。混淆本质上是不能阻止反编译的,只能增加反编译以后阅读理解的难度罢了。3.混淆在代码优化方面
1.删除冗余代码,记录代码和元数据,未使用的资源和本机库2.Dex文件的自动分割超过Dex格式强加的大小限制
3.资源和代码优化
4.在build.grandle添加
buildTypes { release { signingConfig signingConfigs.release shrinkResources true // 移出无用的res文件 minifyEnabled true // 是否需要使用下面的混淆文件进行代码混淆 zipAlignEnabled true // Zipalign优化 proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' } }
注意:工程中出现多个module时,只需要修改app底下build.gradle中的minifyEnabled true即可。
5.在proguard-rules.pro中加入混淆规则
# ============================================= 基础规则 ============================================= # 指定代码的压缩级别 -optimizationpasses 5 # 混淆后类名都为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共的库的类 -dontskipnonpubliclibraryclasses # 指定不去忽略非公共的库的类的成员 -dontskipnonpubliclibraryclassmembers # 不做预校验的操作 -dontpreverify # 混淆时是否记录日志 -verbose # 混淆时所采用的算法 -optimizations !code/simplification/cast,!field/*,!class/merging/* # 不混淆Annotation -keepattributes *Annotation*,InnerClasses # 不混淆泛型 -keepattributes Signature # 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable # 列出没有被混淆的类 -printseeds seeds.txt # 列出从APK中移除的代码 -printusage unused.txt # 混淆前后命名的变化 -printmapping mapping.text # 这些资源为api资源,保持不被混淆 -dontwarn android.support.** -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.support.annotation.** -keep public class * 4000 extends android.app.Application -keep public class * extends android.view.View -keep public class * extends android.app.Service -keep public class * extends android.app.Fragment -keep public class * extends android.app.Activity -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.preference.Preference -keep public class * extends android.app.backup.BackupAgentHelper -keep public class com.android.vending.licensing.ILicensingService -keep class android.support.** { *; } -keep class android.support.v4.** { <fields>; <methods>; } -keep interface android.support.v4.app.** { <fields>; <methods>; } -keepclasseswithmembernames class * { native <methods>; } -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # R文件 -keep class **.R$* { *; } # WebView -keepclassmembers class fqcn.of.javascript.interface.for.Webview { public *; } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, jav.lang.String); } # ============================================= 自定义混淆 ============================================= # ......
6.jar混淆
默认已经将lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加,否则会出现“java.io.IOException: The same input jar is specified twice” 错误。7.常见的第三方库混淆代码
友盟-dontwarn com.google.android.maps.** -dontwarn android.webkit.WebView -dontwarn com.umeng.** -dontwarn com.tencent.weibo.sdk.** -dontwarn com.facebook.** -keep public class javax.** -keep public class android.webkit.** -keep enum com.facebook.** -keepattributes Exceptions,InnerClasses,Signature -keep public interface com.facebook.** -keep public interface com.tencent.** -keep public interface com.umeng.socialize.** -keep public interface com.umeng.socialize.sensor.** -keep public interface com.umeng.scrshot.** -keep class com.android.dingtalk.share.ddsharemodule.** { *; } -keep public class com.umeng.socialize.* { *; } -keep class com.facebook.** -keep class com.facebook.** { *; } -keep class com.umeng.scrshot.** -keep public class com.tencent.** { *; } -keep class com.umeng.socialize.sensor.** -keep class com.umeng.socialize.handler.** -keep class com.umeng.socialize.handler.* -keep class com.umeng.weixin.handler.** -keep class com.umeng.weixin.handler.* -keep class com.umeng.qq.handler.** -keep class com.umeng.qq.handler.* -keep class UMMoreHandler{ *; } -keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage { *; } -keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject { *; } -keep class im.yixin.sdk.api.YXMessage { *; } -keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{ *; } -keep class com.tencent.mm.sdk.** { *; } -keep class com.tencent.mm.opensdk.** { *; } -dontwarn twitter4j.** -keep class twitter4j.** { *; } -keep class com.tencent.** { *; } -dontwarn com.tencent.** -keep public class com.umeng.com.umeng.soexample.R$*{ public static final int *; } -keep public class com.linkedin.android.mobilesdk.R$*{ public static final int *; } -keep class com.tencent.open.TDialog$* -keep class com.tencent.open.TDialog$* { *; } -keep class com.tencent.open.PKDialog -keep class com.tencent.open.PKDialog { *; } -keep class com.tencent.open.PKDialog$* -keep class com.tencent.open.PKDialog$* { *; } -keep class com.sina.** { *; } -dontwarn com.sina.** -keep class com.alipay.share.sdk.** { *; } -keepnames class * implements android.os.Parcelable { public static final ** CREATOR; } -keep class com.linkedin.** { *; }
极光推送
-dontwarn cn.jpush.** -keep class cn.jpush.** { *; } -keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; } -dontwarn cn.jiguang.** -keep class cn.jiguang.** { *; }
OkHttp
-dontwarn okio.** -dontwarn okhttp3.logging.** -keep class okhttp3.internal.** { *; } -dontwarn javax.annotation.** -dontwarn javax.annotation.Nullable -dontwarn javax.annotation.ParametersAreNonnullByDefault
Retrofit
-dontwarn retrofit2.** -keep class retrofit2.** { *; }
RxJava,RxAndroid
-dontwarn sun.misc.** -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { long producerIndex; long consumerIndex; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { rx.internal.util.atomic.LinkedQueueNode producerNode; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { rx.internal.util.atomic.LinkedQueueNode consumerNode; }
Gson
-dontwarn com.google.** -keep class com.google.gson.** { *; } -keep class com.google.gson.stream.** { *; } -keep class com.google.protobuf.** { *; }
Glide
-keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # Glide自定义(ImageLoaderModule)缓存时添加如下混淆 -keepnames class com.common.imageloader.ImageLoaderModule
Glide v4.0
-keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * extends com.bumptech.glide.AppGlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # for DexGuard only -keepresourcexmlelements manifest/application/meta-data@value=GlideModule # Glide自定义(ImageLoaderModule)缓存时添加如下混淆 -keepnames class com.common.imageloader.ImageLoaderModule
8.通过反编译检测混淆是否成功
注:反编译是不道德的行为,可根据需求反编译自己的工程即可。切勿编译他人工程。反编译有多种方式,这里使用dex2jar进行反编译。
下载反编译工具
点击下载dex2jar
点击下载jd-gui-windows
解压后将你的apk后缀改为zip格式。
如:sample-app.apk改为sample-app.zip
将sample-app.zip进行解压。得到classes.dex文件,将classes.dex复制到与dex2jar解压后同目录下。
调用Dos命令,输入如下命令进行转换,(AndroidTools为我自己常用工具目录下,可根据自己的目录地址调用)
Dex2jar是将Android的.dex文件转换成Java的.class格式的文件,这仅是将一种二进制格式转换成另外一种二进制格式,并不是转换Java源代码。
dex2jar.bat classes.dex
命令执行成功后会生成一个对应的classes_dex2jar.jar文件,用jd-gui-windows打开classes_dex2jar.jar文件便可看到包名和类型都变成了小写abcd…..等就代表着要混淆的文件已经混淆成功。
相关文章推荐
- Android APK反编译和代码混淆
- androidSdk2.3的proguard混淆代码工具,防止反编译
- android 反编译---and---混淆代码
- android,代码混淆,反编译,ADT 20版本
- Android 代码混淆 以及 反编译 的实现
- 详细讲解Android对自己的应用代码进行混淆加密防止反编译
- android代码混淆和反编译
- Android代码混淆防止反编译APK获取源码
- 如何混淆Android项目代码(ProGuard),防止反编译
- Android App 反编译与代码混淆
- Android代码混淆及反编译
- Android APK安全: 代码混淆且加壳防止反编译
- Android代码混淆及反编译
- Android Apk的反编译与代码混淆
- 详细讲解Android对自己的应用代码进行混淆加密防止反编译
- Proguard android代码混淆 防止反编译
- Android 代码混淆及反编译方法
- Android代码混淆 反编译
- Proguard android代码混淆 防止反编译
- Android 代码混淆防止反编译