Android开发之 混淆加固和反编译

而今眼目下的新社会,让我没了安全感!!为什么这么说呢?p2p跑路,银行卡被盗刷、个人信息泄露等不胜枚举,就拿银行卡说事吧,造成银行卡信息泄露的主要有取款时泄露(针孔摄像)和各大商场超市刷卡、保险办信用卡等方式,其中与我们切身相关的是android app开发的安全问题,被木马入侵盗取个人信息,破解缓存读取相关资料,或者反编译apk,修改支付相关先做一个异步通知,post用户银行卡相关个人信息,重新打包上线,黑客入侵android系统漏洞那就不说了多了去了,黑帽大会就有一例,如有兴趣了解自行检索。

我们作为开发者,面临这种情况我们该如何做呢,首先必须做好安全工作混淆、签名、加固,这样既可以保证用户的权益还可以保护我们的劳动成果,反编译技术也是我们的必需品,好处谁用谁知道!


通过官方文档了解到,ProGuard是一款免费的Java类文件压缩器、优化器和混淆器。它能发现并删除无用类、字段(field)、方法和属性值(attribute)。它也能优化字节码并删除无用的指令。最后,它使用简单无意义的名字(abcd..)来重命名你的类名、字段名和方法名。经过以上操作的jar、apk文件会变得更小,并很难进行逆向工程。而如果想要你的代码混淆成功,(as)你首先需要开启混淆的阀门minifyEnabled true,gradle配置如下

android {    
  buildTypes {   
       release {  
                  minifyEnabled true 
                  proguardFiles getDefaultProguardFile(‘proguard-android.txt'),'proguard-rules.pro'   
                } 
            }    
      ...
    }

proguardFiles配置的是混淆规则文件,默认支持上面两个配置文件,然而我们在项目里面能看到默认的规则配置文件proguard-rules.pro,但是proguard-android.txt文件在哪里呢?需要进入这里

不难发现配置文件还有一个proguard-android-optimize.txt文件,不错这也是一个混淆规则配置文件,相比较于其他的混淆规则配置文件,这个混淆配置效果更好,打个比方:有new.apk体积大小10m,用了proguard-rules.pro混淆配置后体积6m,而用了proguard-android-optimize.txt混淆配置,体积变成了2m!!你没听错,没听错,没听错,就是这么神奇,再也不用担心apk体积了。

android studio支持多渠道打包,对应会生成多个渠道对应的apk文件,而不同的渠道可以不添加或者添加1个或多个混淆规则,如下图

android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                   'proguard-rules.pro'
        }
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'flavor2-rules.pro'
        }
    }
}

至于这些规则具体怎么定义稍后再来说,通过签名打包apk,生成的apk文件在module的build文件下面,然而这里面却内藏玄机,下面是效果图

由于我打开了混淆规则阀门配置,在签名apk后生成mapping目录,下面有了这么四个文件,具体这四个文件作用何在呢,且看官方文档解释

  • dump.txt // 介绍了所有的class文件的内部结构。

  • mapping.txt // 提供原文件和混淆后的类文件的类名、方法、和变量名字

  • seeds.txt // 列出不混淆的类和成员

  • usage.txt //列出的代码是从apk文件删除。(删除无用的方法和空格)

在某些情况下,混淆配置如果只有用到到删除所有未使用代码,默认的混淆器配置文件’proguard-rules.pro’是足够的。然而,很多情况下是很难分析正确,它可能用到你的应用程序需要删除代码。一下情况时:

  • 当你的应用程序需要调用jni的方法

  • 当你的应用程序处理代码在运行时(如反射orintrospection)

  • 应用程序的唯一类AndroidManifest.xml

以上这种情况,我们需添加混淆规则-keep 以保证指定类不被混淆

-keep public class ClassName

由于每一次的签名打包发布,mapping.txt文件都会被覆盖,所以在我们发布版本后注意copy保存文件,以便于出现了bug需要跟踪mapping文件,然而mapping.txt文件内容是很杂乱的,要怎么跟踪分析它呢?这时候需要用到(window)retract.bat文件了

跟踪工具语法:

retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]

这语法太抽象了,实在难以琢磨,于是乎我在一个demo里面故意制造一异常setContentView (return 0;)打包签名后手机端运行,抛出exception如下:

上图可见简单的类名混淆是成功的,我们把这个日志复制到创建的obfuscated_trace.txt堆栈跟踪文件,再到命令行切换到retrace.bat文件目录下,执行上面的语法,进行堆栈跟踪分析,实例如下

官网提到的资源的合并删除等可以减小apk大小,这不是本篇的重点略过了,下面再来看看混淆规则的具体定义。

指定包下面的类不参与混淆

-keep class com.idea.ui.adapter.** { *; }

指定的类的子类不参与混淆

-keep public class * extends android.app.Fragment

指定代码的压缩级别

 -optimizationpasses 5

包名不混合大小写

-dontusemixedcaseclassnames 

忽略非公共的库类

-dontskipnonpubliclibraryclasses 

优化 不优化输入的类文件

-dontoptimize 

预校验

-dontpreverify 

混淆时是否记录日志

-verbose 

保护注解

-keepattributes *Annotation*

基本的混淆规则用法,如果还需要了解更多可以参考系统自带的proguard-android.txt文件中的混淆规则实例,在开发中会用到一些第三方开源库,和第三方的平台,混淆报错需要对应各自的库、文档,添加相应的混淆规则,例如Gson

#如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
#gson
#-libraryjars libs/gson-2.2.2.jar
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

反编译上例用到的apk,对比查看混淆的效果,首先我们需要反编译工具

切换到命令行到指定的apktool目录下运行命令

apktool.bat d -f  ***.apk  fileName

效果如下

反编译后可以发现文件名已然改变,如果你想将反编译完的文件重新打包成apk,执行命令

apktool.bat b fileName(用于存放编译出来的apk文件夹)

*下面再来反编译java源码,将要反编译的APK后缀名改为.zip,双击打开得到其中的classes.dex(可能存在多个.dex文件)文件,classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内,接着
在命令行下切换到到dex2jar-0.0.9.15 目录,输入dex2jar.bat classes.dex,效果如下:*

生成jar

再把生成的jar通过下载好的反编译工具jd-gui.exe打开如下

至于apk加固原理分析(dex文件加密后生成新的dex),表示个人技术有限,只用过第三发加固如爱加密、百度等,实现原理可以参考这篇文章http://blog.csdn.net/jiangwei0910410003/article/details/48415225,个人认为并不是每个app都需要混淆加固,就商业项目而言,不涉及用户安全隐私的可以不用混淆加固


参考资料

http://blog.csdn.net/leeo1010/article/details/49903759
http://blog.csdn.net/bjstyle/article/details/47001277

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值