android_混淆_防反编译_图文教程

问题描述:

     安卓打包的apk文件可以轻易的使用dex2JAR.bat轻松反编译为java源文件.

    这对于很多辛辛苦苦开发的程序员是很沉重的打击呀...

             为防止别人破解自己的程序.我们需要添加混淆功能;

什么是混淆? 上面这句话讲了.这是一个可以防止别人"破解"的东东

      


先写下教程.告诉怎么弄.最后在说原理



1. 解决方案:

2.3版本以上在eclipse自动生成的default.properties文件中

加上一句“proguard.config=proguard.cfg”

可以对代码进行混淆,反编译后是很难看懂的。



 混淆后.破解的程序源码会是这样子的..你的程序会被替换成这么一堆没意义的字符替代




  就算看自己的程序.估计也不明白在说什么. 最少我看不懂...



2.3之前的SDK版本也没关系,把上面的proguard.cfg文件复制一份放到项目中,然后进行相同的操作即可。


关于使用第三方的包的问题.


Android - proguard混淆器使用,有引用第三方jar包的时候报错:

You may need to specify additional libraryjars (using '-libraryjars')

处理方法:在proguard.cfg文件顶部加入

-libraryjarslibs/umeng-sdk.jar

-dontwarn com.motorola.**

-keep class com.motorola.** { *;}

说明:-dontwarn和-keep结合参数使用来保持第三方库中的类而不乱,

         -dontwarn com.motorola.**

        意思是保持com.motorola.**这个包里面的所有类和所有方法而不混淆

        -keep class com.motorola.** { *;}

              意思是ProGuard不要警告找不到com.motorola.**这个包里面的类的相关引用。对应包名改成你对应的jar包顶层package  

 详细可以查看官方文档 http://developer.android.com/tools/help/proguard.html



如果你使用了第三方的库.那么就需要在proguard.cfg里面加多  

-dontwarn com.motorola.**

-keep class com.motorola.** { *;}

这样类型的话..我们可以看到图示…打开第三方的jar .里面有很多包…

我们只需要 写下最前面的那个公共的包名部分...就可以了…如图所示.

这样你把所有应用的第三方的JAR里面的包名都写进去.就可以了!!!!!

EG:

 





                      proguard 原理


           Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,

           除了注释外,原来的code 基本都可以看到。

           为了防止重要code 被泄露,我们往往需要混淆

          (Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称),

            这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。


           proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,

           然后把这些class 文件的可以混淆java 元素名混淆掉。

           在分析class 的同时,他还有其他两个功能,删除无效代码(Shrinking 收缩),

           和代码进行优化 (Optimization Options)。


        缺省情况下,proguard 会混淆所有代码,

        但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。

   一, 我们用到反射的地方。


    二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。


  三, 是我们的java 元素名称是在配置文件中配置好的。

还有的情况狂是

Android 程序 ,下面这样代码混淆的时候要注意保留。

Android系统组件,系统组件有固定的方法被系统调用。

被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。

Android Parcelable ,需要使用android 序列化的。

其他Anroid 官方建议 不混淆的,如

android.app.backup.BackupAgentHelper

android.preference.Preference

com.android.vending.licensing.ILicensingService

Java序列化方法,系统序列化需要固定的方法。

枚举 ,系统需要处理枚举的固定方法。

本地方法,不能修改本地方法名

annotations 注释

数据库驱动

有些resource 文件


              所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的

            所以 如果你打开项目自带的proguard.cfg 文件时候.会看到这么段代码

 

 -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 com.android.vending.licensing.ILicensingService

 

但不得不说.混淆的好处是明显的.可也是有一定风险的.


代码混淆后虽然有混淆优化的好处,但是它往往也会带来如下的几点问题
1,混淆错误,用到第三方库的时候,必须告诉 proguard 不要检查,否则proguard 会报错。
2,运行错误,当code 不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种情况问题最多。
3,调试苦难,出错了,错误堆栈是混淆后的代码 ,自己也看不懂。这时候就真的苦逼了.



                                            下里罗列一堆的配置.看着需要用吧.


-include {filename}    从给定的文件中读取配置参数 

-basedirectory {directoryname}    指定基础目录为以后相对的档案名称 

-injars {class_path}    指定要处理的应用程序jar,war,ear和目录 

-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称 

-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 

-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。 

-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。 

保留选项 

-keep {Modifier} {class_specification}    保护指定的类文件和类的成员 

-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好

-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 

-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) 

-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除) 

-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) 

-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件 

压缩 

-dontshrink    不压缩输入的类文件 

-printusage {filename} 

-whyareyoukeeping {class_specification}     

优化 

-dontoptimize    不优化输入的类文件 

-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用 

-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员 

混淆 

-dontobfuscate    不混淆输入的类文件 

-printmapping {filename} 

-applymapping {filename}    重用映射增加混淆 

-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称 

-overloadaggressively    混淆时应用侵入式重载 

-useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆 

-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中 

-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中 

-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名 

-keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. 

-renamesourcefileattribute {string}    设置源文件中给定的字符串常量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值