Android混淆机制

注意:本篇文章是本人阅读相关文章的总结,方便以后查阅,所有内容非原创,侵权删。

本篇文章内容来自于
1.Android高级进阶 顾浩鑫
2.相对应的知识块的最下方会给出原来的帖子的链接

前言

混淆是增加逆向工程和破解的难度,防止APP知识产权被窃取的一个有力手段。
Android混淆包括三种类型
1.Java代码的混淆
2.Native(C&C++)代码的混淆
3.资源文件的混淆

目录

  1. Java代码的混淆
    --1.1 Proguard如何启用
    --1.2 编写混淆文件
    --1.3 Proguard生成的文件
  2. Native(C&C++)代码的混淆 NDK(待补)
  3. 资源文件的混淆(待补)

1. Java代码的混淆-Proguard

Java代码混淆一般依赖于Proguard或者DexGuard工具。其中Proguard免费开源,Proguard付费。DexGuard强大的多,但是一般情况下用DexGuard就足够了。

Android默认集成了ProGuard,它是一个免费的用于压缩、优化和混淆Java字节码的工具,混淆的功能主要是用简短的无意义的字母组合来对代码中的类、字段、方法和属性进行重命名,但它无法对字符串进行混淆
即使用Proguard后,我们还是可以看到反编译后代码中完整的字符串定义。
我们可以选择商业版的Proguard-DexGuard。DexGuard对代码、资源、字符串、AndroidManifest.xml等进行了全面的加密和混淆。

Proguard的特性
Progurad不仅可代码混淆,还提供其他功能。主要有4个功能特性:
1.压缩:Proguard能通过分析字节码,能够检测并移除没有使用到的类、字段、方法和属性。
2.优化:优化java字节码,同时移除没有使用到的指令。
3.混淆:使用无意义的简短字母组合对类名、字段名和方法名进行重命名。
4.预检验:对上述处理后的代码进行预检验。

1.1 Proguard如何启用

在需要进行的module的build.gradle进行配置

android {
    ...
    buildTypes {
        release {
            minifyEnabled true //用于指定是否对项目的代码进行混淆 true表示混淆 false表示不混淆
            //proguardFiles用于指定混淆时使用的规则文件
            //这里指定了2个 proguard-android.txt是AndroidSDK目录下的tools/proguard的,里面是所有项目通用的混淆规则
            //proguard-rules.pro是当前项目根目录下的,里面可以编写当前项目特有的混淆规则
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    ...
}

1.2 编写混淆文件

1.2.1 proguard-android.txt 默认混淆配置文件

proguard-android.txt位于AndroidSDK目录/tools/proguard,该文件是Proguard的基本配置,几乎是每个APP都要用到的配置。

1.2.2 proguard-rules.pro 文件的编写

proguard-android.txt 默认混淆配置文件的配置是远远不够的,我们需要根据自身APP的特殊性增加或减少相关的配置。

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

  • 公共的混淆规则:每个APP都适用,主要是针对Proguard的基本配置,以及Android SDK中API设置的规则,例如Activity、Parceable等。
  • APP特有的混淆规则:根据APP自身的特点进行设置,例如某些类会被反射调用,如果被混淆,那么反射就找不到了。
  • 第三方函数库或者SDK的混淆规则:如果APP引入了第三方开源函数库或者SDK,那么需要查看这些函数库或者SDK的使用说明,将需要去混淆的地方加上去。

混淆模版:(具体查看5分钟搞定android混淆)

#-------------------------------------------定制化区域----------------------------------------------
#---------------------------------1.实体类---------------------------------



#-------------------------------------------------------------------------

#---------------------------------2.第三方包-------------------------------



#-------------------------------------------------------------------------

#---------------------------------3.与js互相调用的类------------------------



#-------------------------------------------------------------------------

#---------------------------------4.反射相关的类和方法-----------------------



#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------

#-------------------------------------------基本不用动区域--------------------------------------------
#---------------------------------基本指令区----------------------------------
-optimizationpasses 5
-dontskipnonpubliclibraryclassmembers
-printmapping proguardMapping.txt
-optimizations !code/simplification/cast,!field/*,!class/merging/*
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
#----------------------------------------------------------------------------

#---------------------------------默认保留区---------------------------------
-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.view.View
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.** {*;}

-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
-keep class **.R$* {
 *;
}
-keepclassmembers class * {
    void *(**On*Event);
}
#----------------------------------------------------------------------------

#---------------------------------webview------------------------------------
-keepclassmembers class fqcn.of.javascript.interface.for.Webview {
   public *;
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, jav.lang.String);
}
#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------

1.3 Proguard生成的文件

在AS中使用Proguard对代码进行混淆,会在build/outputs/mapping/release目录下生成四个文件。
1.dump.txt:列出生成的APK文件中所有class文件的内部结构。
2.mapping.txt:列出混淆前的java源码和混淆后的类、方法和属性名字之间的映射。
3.seeds.txt:列出为混淆的类和成员
4.usage.txt:列出从apk文件中剥离的代码


2.Native(C&C++)代码的混淆 NDK(待补)

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

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

参考
1.Obfuscator-LLVM
2.直接使用由Ryan Welton预先编译的包,具体参见ANdroidObfuscation-NDK这个例子。

3.资源文件的混淆(待补)

资源文件的混淆也没有统一的方案,但是并不常对资源文件进行混淆,因为资源文件的保密性美欧那么高,破解者可以通过apktool轻松得到。

资源文件混淆的好处
1.提高APP破解的难度
2.减少APP的最终包的大小:资源文件的混淆类似于java代码的混淆,也是通过使用无意义的字母来代替完整的命名实现的。他的一个副作用是能在一定程度上减少APP的大小。

资源文件的混淆方案目前有美团和微信两种。
1⃣️美团是通过修改AAPT在处理资源文件相关的源码达到资源文件名的替换。
查看美团Android资源混淆保护实践
2⃣️微信是通过直接修改resources.arsc文件达到资源文件名的混淆。
查看安装包立减1M--微信Android资源混淆打包工具
微信方案开源,地址在AndResGuard

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容