android代码混淆和打包签名

一、何为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文件里
[html]  view plain copy print ?
  1. -optimizationpasses 5  
  2. -dontusemixedcaseclassnames  
  3. -dontskipnonpubliclibraryclasses  
  4. #-dontpreverify  
  5. -dontoptimize  
  6. -verbose  
  7. -dontshrink  
  8. -keepattributes SourceFile,LineNumberTable  
  9. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  
  10.   
  11. -keep public class * extends android.app.Activity  
  12. -keep public class * extends android.app.Application  
  13. -keep public class * extends android.app.Service  
  14. -keep public class * extends android.content.BroadcastReceiver  
  15. -keep public class * extends android.content.ContentProvider  
  16. -keep public class * extends android.app.backup.BackupAgentHelper  
  17. -keep public class * extends android.preference.Preference  
  18. -keep public class * extends android.app.Dialog  
  19. -keep public class * extends android.view.View  
  20.   
  21. -keep public class com.android.vending.licensing.ILicensingService  
  22.   
  23. -keepclasseswithmembernames class * {  
  24.     native <methods>;  
  25. }  
  26.   
  27. -keepclasseswithmembers class * {  
  28.     public <init>(android.content.Context, android.util.AttributeSet);  
  29. }  
  30.   
  31. -keepclasseswithmembers class * {  
  32.     public <init>(android.content.Context, android.util.AttributeSet, int);  
  33. }  
  34.   
  35. -keepclassmembers class * extends android.app.Activity {  
  36.    public void *(android.view.View);  
  37. }  
  38.   
  39. -keepclassmembers enum * {  
  40.     public static **[] values();  
  41.     public static ** valueOf(java.lang.String);  
  42. }  
  43.   
  44. -keep class * implements android.os.Parcelable {  
  45.   public static final android.os.Parcelable$Creator *;  
  46. }  
这些基本都是共用的

3.根据你的jar包添加相应的代码,解释在下面部分
[html]  view plain copy print ?
  1. -libraryjars libs/android-support-v4.jar  
  2. -dontwarn android.support.v4.**  
  3. -keep class android.support.v4.** { *; }   
  4.   
  5. -libraryjars libs/fastjson-1.2.6.jar  
  6. -dontwarn com.alibaba.fastjson.**  
  7. -keep class com.alibaba.fastjson.** { *; }   
  8.   
  9. -libraryjars libs/alipaysdk.jar  
  10. -libraryjars libs/alipaysecsdk.jar  
  11. -libraryjars libs/alipayutdid.jar  
  12. -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...)



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 啦

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

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


转自:原文地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值