android混淆总结

来源:互联网 发布:ora01109数据库未打开 编辑:程序博客网 时间:2024/06/05 20:30

一、何为Android混淆呢?

Android代码混淆,又称Android混淆,是伴随着Android系统的流行而产生的一种AndroidAPP保护技术,用于保护APP不被破解和逆向分析。

代码混淆技术基本原理是使反编译工具反编译出来的代码人难以阅读,从而达到防止被逆向破解的目的。PC上的代码混淆技术已经很成熟,有加花指令、多态变形等技术手法,Android代码混淆技术才刚刚起步,目前已知的技术手法如下。

Java类名、方法名混淆

Dalvik字节码包含了大量的调试信息,如类名、方法名、字段名、参数名、变量名等,使用反编译工具可以还原这些信息。由于类名、方法名等通常都会遵循一定的命名规范,破解者很容易根据这些信息来猜测代码功能,阅读起来就跟查看源代码一样。从Android2.3开始,Google在SDK中加入了一款叫ProGuard的代码混淆工具,ProGuard会删除这些调试信息,并用无意义的字符序列来替换类名、方法名等,使得使用反编译出来的代码难以阅读,提升逆向难度。使用ProGuard混淆过过后,反编译出来的类名和方法名无法阅读,但是反编译出来的功能代码仍然是非常容易阅读的,和源代码差不多,破解者仍通过阅读功能代码来自行标记类名、方法名等,然后逆向破解。

Java代码混淆

通过对功能代码流程进行乱序混淆,实际运行时乱序混淆后的代码流程却和原始代码流程是一样的,但反编译出来的代码流程静态阅读时与原始流程有很大差异,使破解者很难通过静态分析理解代码功能,从而保护代码不被逆向分析。比如,原始的代码流程是1->2->3->4->5->6->7,经过乱序混淆后静态反汇编查看到的代码流程可能变成2->7->5->1->6->4->3,实际运行时代码流程仍然是1->2->3->4->5->6->7。目前使用这种代码混淆技术的Android保护工具有爱加密。

Dalvik字节码加密

将dex文件中的部分或全部Dalvik字节码加密,每次需要执行时由专门的Native代码负责动态解密和回填,静态反编译出来的代码已经无法阅读甚至无法反编译,动态调试也难以逆向分析。采用这种保护技术的Android保护工具有爱加密等。

二、具体操作

好了,水也吹了这么多,接下来来点实际点的,我是根据老大给的项目做的,可能哪里会有些提点不到,各位多多包涵哈大笑

1.项目根目录下的project.properties文件,将“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”这行前的“#”删除,然后改成proguard.config=proguard.cfg(在项目根目录下创建的一个新文件)
2.拷贝下面代码到proguard.cfg文件里
-optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses#-dontpreverify-dontoptimize-verbose-dontshrink-keepattributes SourceFile,LineNumberTable-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keep public class * extends android.app.Dialog-keep public class * extends android.view.View-keep public class com.android.vending.licensing.ILicensingService-keepclasseswithmembernames class * {    native <methods>;}-keepclasseswithmembers class * {    public <init>(android.content.Context, android.util.AttributeSet);}-keepclasseswithmembers class * {    public <init>(android.content.Context, android.util.AttributeSet, int);}-keepclassmembers class * extends android.app.Activity {   public void *(android.view.View);}-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}-keep class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator *;}
这些基本都是共用的

3.根据你的jar包添加相应的代码,解释在下面部分
-libraryjars libs/android-support-v4.jar-dontwarn android.support.v4.**-keep class android.support.v4.** { *; } -libraryjars libs/fastjson-1.2.6.jar-dontwarn com.alibaba.fastjson.**-keep class com.alibaba.fastjson.** { *; } -libraryjars libs/alipaysdk.jar-libraryjars libs/alipaysecsdk.jar-libraryjars libs/alipayutdid.jar-libraryjars libs/libammsdk.jar
注解:

-braryjars libs/nineoldandroids-2.4.0.jar----指明lib包的在工程中的路径

而-dontwarn com.xx.bbb.**和-keep class com.xx.bbb.** { ;}

这两个参数用来保持第三方库中的类而不乱,将-dontwarn和-keep 结合使用,-dontwarn com.xx.bbb.**就是叫ProGuard不要警告找不到com.xx.bbb.**这个包里面的类的相关引用,而-keep class com.xx.bbb.** { ;}就是保持com.xx.bbb.*这个包里面的所有类和所有方法而不混淆!


根据情况来看,有些jar包不用加这两句也可以,可以都先不加,然后签名导出apk看看,如果有异常,根据异常来加。

签名导出apk,小小攻城狮须知---(项目右键,Android Tools ---->第三个Export Signed Application Package...)

参照:http://www.eoeandroid.com/thread-276441-1-1.html?_dsign=ed3a736b


4.(嘿嘿,这个部分是根据情况来的,我的项目就到第三步把jar对应的代码添加完了就 O 了)
将你不需要混淆的部分申明进来,因为有些类经过混淆会导致程序编译不通过,如下:

-keep public class * extends android.app.Fragment  
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.**
-keep public class com.android.vending.licensing.ILicensingService

--以上都是API里边的类,最好都要避免混淆

有些很特殊的,例如百度地图,你需要添加以下申明:

-keep class com.baidu.** { *; } 
-keep class vi.com.gdi.bgl.android.**{*;}

根据我的经验,一般model最好避免混淆(model无关紧要,不混淆也没多大关系)如:

-keep class com.bank.pingan.model.** { *; }


参照:http://blog.csdn.net/lovexjyong/article/details/24652085


搞完以后反编译看下结果,有很多a b c 啊这样的包名类名还有属性名就OK 啦

反编译如果不懂上网查下,很容易的

小弟是小小攻城狮,有什么写的不好的,大家多多指教哈!谢谢


2 0
原创粉丝点击