微信AndResGuard资源混淆知识点巩固

git: https://github.com/shwenzhang/AndResGuard

本来想自己研究资源混淆的工具的,开始看到美团的方案说修改aapt可以达到目的,可是问题来了,搞了很久aapt的源码始终没有编译出来,后来就用微信的开源工具(AndResGuard)了。

AndResGuard的原理是 解压apk包->修改resources.arsc文件内容->重新命名资源文件名->重新签名打包apk

 

图0,java里面的源码

微信AndResGuard资源混淆知识点巩固

 

图1 是dex文件的字节码,0x7f0a001d是十六进制,对应的十进制是2131361821

微信AndResGuard资源混淆知识点巩固

图2

微信AndResGuard资源混淆知识点巩固

打包的时候,dex文件里面引用的只是一个id索引,看图1 知道,调用的时候,dex 会根据id索引去找到相对应的资源文件名,所以,修改resources.arsc里面的name,只有资源文件名能对应上,就不会影响java代码里面的引用

图3

微信AndResGuard资源混淆知识点巩固

 

使用:

1.在项目根目录的build.gradle引入   

classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.15'

2.在app根目录新建多一个  *.gradle 文件(我这里是用了and_res_guard.gradle),用于写AndResGuard的配置,内容如下:

apply plugin: 'AndResGuard'

andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    compressFilePattern = [
            "*.png",
            "*.jpg",
            "*.jpeg",
            "*.gif",
            "resources.arsc"
    ]
    whiteList = [
            // your icon
            "R.drawable.icon",
            // for fabric
            "R.string.com.crashlytics.*",
            // for umeng update
            "R.string.tb_*",
            "R.layout.tb_*",
            "R.drawable.tb_*",
            "R.drawable.u1*",
            "R.drawable.u2*",
            "R.color.tb_*",
            // umeng share for sina
            "R.drawable.sina*",
            // for google-services.json
            "R.string.google_app_id",
            "R.string.gcm_defaultSenderId",
            "R.string.default_web_client_id",
            "R.string.ga_trackingId",
            "R.string.firebase_database_url",
            "R.string.google_api_key",
            "R.string.google_crash_reporting_api_key",

            //友盟
            "R.string.umeng*",
            "R.string.UM*",
            "R.layout.umeng*",
            "R.drawable.umeng*",
            "R.id.umeng*",
            "R.anim.umeng*",
            "R.color.umeng*",
            "R.style.*UM*",
            "R.style.umeng*",

            //融云
            "R.drawable.u*",
            "R.drawable.rc_*",
            "R.string.rc_*",
            "R.layout.rc_*",
            "R.color.rc_*",
            "R.id.rc_*",
            "R.style.rc_*",
            "R.dimen.rc_*",
            "R.array.rc_*"
    ]

    sevenzip {
        artifact = 'com.tencent.mm:SevenZip:1.2.10'
        //path = "/usr/local/bin/7za"
    }
}

3.在app里面的build.gradle 引入刚刚新建的文件

apply from: 'and_res_guard.gradle'

4.配置完成,可以编译打包,点击andresguard里面的选项,根据相应情况进行编译

微信AndResGuard资源混淆知识点巩固