Android移动安全(一)Android混淆机制

        混淆是增加逆向工程和破解的难度,防止APP知识产权被窃取的一个有力手段,高级的代码混淆甚至可以有效的保护存储在客户端的密钥,同时混淆也有很多需要注意的地方。从广义上讲,Android 中的混淆包括三种类型:Java代码的混淆,Native(c&c++)代码的混淆以及资源文件的混淆。

Java代码的混淆


Java代码的混淆在Android中是最为常见的一种混淆方式,一般依赖于Proguard或者DexGuard工具,其中Proguard是免费且开源的,DexGuard是付费的,它们的特性对比:

Android移动安全(一)Android混淆机制_第1张图片

Proguard的特性


首先我们需要知道的是,在Android 中使用Proguard,它不仅仅为我们提供代码混淆的功能,事实上Proguard主要提供了四个功能特性。

1 压缩:Java源代码通常被编译为字节码,虽然字节码比源代码更简洁,但它本身仍然会包含很多无用的代码,Proguard的压缩功能通过分析字节码,能够检测并移除没有使用到的类,字段,方法等属性

2 优化:优化Java字节码,同时移除没有使用到的指令

3 混淆:使用无意义的简短字母组合对类名,字段名和方法名进行重命名

4 预检验:对上述处理后的代码进行预检验

Proguard的使用和配置

在AndroidStudio中Proguard的使用很简单,只需要在进行混淆的Module中的build.gradle文件中添加如下配置即可(默认生成的build.gradle文件中已经对Proguard进行配置,只不过还没有使用)。

Android移动安全(一)Android混淆机制_第2张图片

其中,proguard-android.txt是Proguard默认的混淆配置文件,位于Android SDK的tools/proguard目录中,该文件是对Proguard基本的配置,几乎是每个APP都要用到的配置,当然这个默认文件的配置远远不够,我们需要根据自身APP的特殊性增加或者减少相关的配置,proguard-android.txt文件内容如下。

Android移动安全(一)Android混淆机制_第3张图片
Android移动安全(一)Android混淆机制_第4张图片

如果默认的proguard-android.txt文件的配置不满足APP的具体需求,那么需要配置module根目录下面的proguard=rules.pro文件,用这个文件的配置信息代替proguard-android.txt文件的配置信息。

proguard-rules.pro文件的编写

混淆文件的规则可以大致分为三种类型:

1 公共的混淆规则:每个app都通用,主要是对proguard的基本配置,以及Android SDK中API设置的规则,例如Activity,Parcelable等。

2 App特有的混淆规则:根据APP自身的特点进行设置,例如某些类会被反射调用,如果被混淆,那么反射就找不到了

3 第三方函数库或者SDK的混淆规则:如果APP引入了第三方开源函数库或者SDK,那么需要查看这些函数库或者SDK的使用说明,将需要去混淆的地方加上去

Android移动安全(一)Android混淆机制_第5张图片
Android移动安全(一)Android混淆机制_第6张图片
Android移动安全(一)Android混淆机制_第7张图片

Proguard生成的文件

在Android Studio中使用Proguard对代码进行混淆,会在build/outputs/mapping.release目录中生成四个文件

Android移动安全(一)Android混淆机制_第8张图片
Android移动安全(一)Android混淆机制_第9张图片
Android移动安全(一)Android混淆机制_第10张图片

Proguard混淆规则合集有国外的android-proguard-snippets以及国内的android-proguard-cn

Native(C/C++)代码的混淆


Android 开发中经常需要在客户端保存敏感信息,相比将敏感信息写在Java层,将其下移到NDK层是个更好的选择,虽然NDK层存储敏感信息安全性很好,但仍然避免不了被破解,为了进一步增强破解的难度,我们需要对NDK层的代码也进行混淆保护。

相比较Java层的代码混淆而已,Native层代码混淆并没有一个标准的方案或者函数库,常见且比较简单的方法是使用花指令,使得Native代码被反汇编时出错,从而让破解者无法清晰正确的反汇编出代码的内容。

下面我们介绍的Obfuscator-LLVM是一个值得关注的项目,这个项目专注于LLVM编译器,这一点使得它可移植性很高,兼容LLVM支持的所有语言和平台,我们可以自己从源码开始编译出二进制包,或者可以直接使用由Ryan Welton预先编译的包

资源文件的混淆


跟Native代码的混淆类似,资源文件的混淆也没有一个统一的方案,事实上,对资源文件进行混淆着一操作并不常见,因为资源文件的保密性没有代码那么高,虽然如此,对项目中对资源文件进行混淆还是有如下好处。

1 提高App被破解的难度:资源文件虽然不会暴漏代码的逻辑,但是如果资源文件不进行混淆的话,破解者可以通过apktool这个工具轻易的得到原始的资源文件,破解者通过资源文件的命名以及内容作为辅助,可以加速对代码的理解和破解

2 减少APP的最终包大小:资源文件的混淆类似Java代码的混淆,也是通过使用无意义的字母来代码完整的命名实现的,它的一个副作用就是能够一定程序上减少APP的包大小

资源文件的混淆方案目前有美团和微信两种,前者是通过修改AAPT在处理资源文件相关的源码达到资源文件名的替换,后者是通过直接修改resources.arsc文件达到资源文件名的混淆,相比之下,微信的方案更优。

你可能感兴趣的:(Android移动安全(一)Android混淆机制)