当前位置: 代码迷 >> Android >> android代码混淆以及怎么判断一个apk代码是否被混淆过
  详细解决方案

android代码混淆以及怎么判断一个apk代码是否被混淆过

热度:62   发布时间:2016-04-28 03:00:36.0
android代码混淆以及如何判断一个apk代码是否被混淆过

1、proguard原理

? ? ? java代码编译成二进制class文件,这个class文件也可以反编译成源代码,除了注释外,其他的code基本都可以看到。为了防止重要code被泄露,我们往往需要混淆,即把方法名,变量名,类名,包名等这些java元素的名称改成让人意想不到的名称,这样代码结构就没有变化,还可以运行,但是想弄懂代码的架构却很难。proguard就起到了这样的作用:

? ? 一、它可以分析一组class的结构,根据用户的配置,然后把这些class文件中可以混淆的java元素进行混淆

?

? ? 二、删除无效的代码

?

? ? 三、对代码进行优化(使用adt插件导出的apk,还进行zipalign优化)

?

缺省情况下,proguard会混淆所有代码,但是下面几种情况是不能改变java元素的名称,否则就会导致程序出错。

? ?一、用到反射的地方([email protected],开发者在调用相应的方法时,需要用到反射)

??

? ?二、当app的代码要依赖于系统的接口时,如被系统代码调用的回调方法,这种方法比较复杂

?

? ?三、java元素名称是配置文件中配置好的

?

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

?

??2、proguard配置

?

? ??-dontwarn缺省proguard会检查每一个引用是否正确,但是第三方库里往往有些不会用到的类,没有正确引用,如果不配置的话,系统就会报错。

?

? ?-keep指定的类和类成员被保留作为入口

?

? -keepclassmembes指定的类成员被保留。

?

?-keepclasswithmembers指定的类和类成员被保留,假如指定的类成员存在的话。

?

3、 proguard问题和风险

?

? ? ?代码混淆后虽然有混淆优化的好处,但是它往往也会带来如下的几点问题:

?

? ? ?一、混淆错误,用第三方库的时候,必须要告诉proguard不要检查,否则proguard无法报错。

?

? ? ?二、运行错误,当code不能混淆的时候,我们必须要正确配置,否则app在运行的时候会出错。

?

? ? ?三、调试苦难,出错了,错误堆栈是混淆后的代码,自己也看不懂了。

?

4、 常见的不能混淆的android code

?

? ? ?一、android系统组件,系统组件有固定的方法被app调用。

? ? ?二、被android resource文件引用到的,名字已经固定,也不能混淆,比如自定义的View。

? ? ?三、android parcelable,需要使用android序列化。

? ? ?四、其他android官方建议不混淆的,如:android.app.backup.BackupAngentHelper,android.preference.Preference,com.android.vending.licensing.ILicensingService

? ? ?五、java序列化方法,系统序列化需要固定的方法

? ? ?六、本地方法,不能修改本地方法名

? ? 七、annotations注释

? ? 八、数据库驱动

? ? 九、有些resource文件

? ? 十、用到反射的地方

5、如何测试一个apk的代码是否被混淆过

?

? ? 方案一:

? ? ? ???一、 下载dex2jar包,解压

? ? ? ? ?二、把apk包的后缀名改为.zip

? ? ? ? ?三、把apk压解压拿到classes.dex文件,并放到dex2jar所在的目录下

? ? ? ? ?四、运行命令dex2jar.exe ?classes.dex

? ? ? ? ?五、下载jd-gui

? ? ? ? ?六、把jar包加载到jd.gui,查看源码,源码中的类名,方法名,变量名是否已经改变

?

? ?方法二:

? ? ??一、下载apktool工具

? ? ? 二、运行apktool.bat d xxx.apk,把apk反编译成smali

? ? ? 三、如果想要进一步查看源码,可下载smali2java

? ? ? 四、使用smali文件的文件名进行分析,如果存在1个或1个以上的资源类的smali文件,就可以证明该apk没有被混淆过。如下图所示:

? ? ?

?备注:是apk的核心代码下的资源文件在混淆后不应该出现上述文件,反之则说明该apk没有进行混淆;使用方案一也是要进入核心代码

?

6、作为一个测试不仅检测自己的apk是否被混淆过,而且要测试是否混淆成功,且混淆正确

?

? ??1、安装被混淆过的apk,进行功能测试

? ? 2、查看混淆好的系统,是否仍保留:Android系统组件,自定义View,Android Parcelable,Android R文件等不能被混淆的文件

?

  相关解决方案