android防反编译技术初体验——混淆

这几天做项目要做混淆,所以搜集资料学习了下,这次主要记录混淆的步骤,如有需要改正和完善的地方,还麻烦能够指出,大家共同进步o(* ̄▽ ̄*)ブ

1.项目防反编译技术步骤:

a) 加密、

b) 混淆、

c) 加壳(加固);

2.加密:对信息进行摘要计算,然后摘要值用私钥进行验签,重要数据使用rsa非对称加密;

3.混淆:Android Studio开发工具自身集成了Java语言的ProGuard技术,对java代码有压缩、优化、混淆、预检的功能,AcFlash项目的Android端使用了ProGuard,以下是使用步骤:

a) 在model中build.gradle配置文件设置minifyEnabled为true;

b) 设置混淆默认数据,在proguard-rules.pro配置文件中配置:

#指定代码的压缩级别:0-7

-optimizationpasses 5

 

#混淆时不使用大小写混淆,混淆后的类名为小写

-dontusemixedcaseclassnames

 

#不去忽略非公共库的类

-dontskipnonpubliclibraryclasses

#不优化输入的类文件

-dontoptimize

 

#不做预校验,android不需要

-dontpreverify

 

#忽略警告

-ignorewarning

 

#混淆后产生映射文件:包含有类名->混淆后类名的映射关系

-verbose

#混淆时所采用的算法,谷歌推荐,一般不修改

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

 

c) 设置项目中所有数据都混淆后,接下来该设置项目哪些内容不需要混淆;

i. 四大组件不被混淆

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

 

ii. 被外部调用的类不被混淆

 -keep public class * extends android.app.Fragment
-keep public class * extends android.app.Application
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v7.app.Fragment
-keep class android.support.** { *; }
-keep public class * extends android.support.**
-keep public class * extends android.view.View

 

iii. 实体类不能混淆

-keep public class com.leadpcom.acflash.bean.** {
    public void set*(***);
    public *** get*();
    public *** is*();
}

 

iv. 自定义控件类不被混淆

-keepclasseswithmembers class * {
    public <init>(android.content.Context,android.util.AttributeSet);
}

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context,android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

 

v. 为了防止在布局中设置onClick事件失效,所以保留在Activity中方法参数是view的方法:

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

 

vi. Parcelable和Serializable都是为了进行序列化,前者是android所特有的,比后者更高效可以intent传递数据,也可进程间通信(IPC),保持 Parcelable、Serializable 不被混淆

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keepnames class * implements java.io.Serializable

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[]

serialPersistentFields;

!static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

 

vii. 资源类不混淆

-keepclassmembers class **.R$* {
    public static <fields>;
}

 

viii. 记录生成的日志数据,gradle build时在本项目根目录输出

#apk 包内所有 class 的内部结构
-dump proguard/class_files.txt
#未混淆的类和成员
-printseeds proguard/seeds.txt
#列出从 apk 中删除的代码
-printusage proguard/unused.txt
#混淆前后的映射
-printmapping proguard/mapping.txt

 

 

ix. 移除Log类打印各个等级日志的代码,除了这种禁止log打印的方法还有一种是通过BuildConfig.DEBUG的变量来控制

-assumenosideeffects class android.util.Log {
    public static *** v(...);
    public static *** i(...);
    public static *** d(...);
    public static *** w(...);
    public static *** e(...);
}

 

x. 引入第三方json解析包不混淆(一般第三方jar包都已混淆过)

-keep class com.google.gson.** { *; }
-keep class com.google.gson.stream.** { *; }

 

xi. proguard会检查每一引用是否正确,但第三方库里常常会有不会用到的类,没有正确引用,如果不配置,会报错

-dontwarn android.support.**

 

xii. 枚举enum不被混淆:暂无

xiii. native方法不被混淆:暂无

xiv. Jni不被混淆:暂无

xv. 对含有反射类的处理:暂无

xvi. 某些功能所涉及到的类及子类不被混淆,如下拉刷新:暂无

xvii. ......(根据项目功能代码,可再补充混淆)

4.加壳:混淆之后,利用乐固(腾讯推出)进行加固,生成最终的apk文件。

 

时间: 2024-08-28 12:41:00

android防反编译技术初体验——混淆的相关文章

APK防反编译技术

APK防反编译技术 下载地址:地址 我们的APK实际上就是一个ZIP压缩文件,里面包含有一个classes.dex,我们编译后生成的程序代码就全部在那里了,通过apktool等工具可以轻松地将它们反编译成smali代码.有了这些反编译出来的smali代码之后,我们就可以轻松地了解别人的APK使用的一些技术或者直接修改别人的APK.由于这些APK反编译工具的存在,我们迫切地希望能有方法去防止别人来反编译我们的APK,从而保护自己的商业机密和利益. 下载地址:地址 版权声明:本文为博主原创文章,未经

Android代码混淆防反编译解决方案研究

做Android开发的都知道要做混淆去防apk被反编译.破解,通过proguard进行Java代码混淆.但是,Android代码混淆真的能起到实质性的作用吗?看下面分析 1.Android代码混淆 如上图,对Android 代码进行混淆后混淆器将代码中的所有变量.函数.类的名称加密为简短的英文字母代号,在APP被破解后增加破解者对代码的阅读难度. 但是混淆的功效只能运作在APP已经被破解后,而且只是增加破解者的难度时间,对其防止破解的作用意义不是很大. 那么,Android代码混淆不能从根本上防

android apk 防止反编译技术第四篇-对抗JD-GUI

又到周末一个人侘在家里无事可干,这就是程序员的悲哀啊.好了我们利用周末的时间继续介绍android apk防止反编译技术的另一种方法.前三篇我们讲了加壳技术(http://my.oschina.net/u/2323218/blog/393372).运行时修改字节码(http://my.oschina.net/u/2323218/blog/396203)和伪加密(http://my.oschina.net/u/2323218/blog/399326),如果有不明白的可以查看我的博客的前三篇中关于这

防反编译、混淆文件proguard.cfg与proguard-project.txt详解

在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt. 如果需要对项目进行全局混码,只需要进行一步操作: 将project.properties的中 “#  proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就可以了. 如 果有一些代码不能被混淆,比如需要加入了so文件

android apk 防止反编译技术第一篇-加壳技术

做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成果我会做成一个系列慢慢写出来与大家分享,共同进步.这篇主要讲apk的加壳技术,废话不多说了直接进入正题. 一.加壳技术原理 所谓apk的加壳技术和pc exe的加壳原理一样,就是在程序的外面再包裹上另外一段代码,保护里面的代码不被非法修改或反编译,在程序运行的时候优先取得程序的控制权做一些我们自己想

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

android apk 防止反编译技术第三篇-加密

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

android apk 防止反编译技术第二篇-运行时修改Dalvik指令

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

转: android apk 防止反编译技术(1~5连载)

转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成果我会做成一个系列慢慢写出来与大家分享,共同进步.这篇主要讲apk的加壳技术,废话不多说了直接进入正题. 一.加壳技术原理 所谓apk的加壳技术和pc exe的加壳原理一样,就是在程序的外面再包裹上另外一段代码,保护里面的代码不被非法修改或反编译,在程序