【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )
文章目錄
- 一、resources.arsc 資源映射表 混淆
- 二、resources.arsc 資源映射表二進(jìn)制格式分析
- 三、參考資料
資源混淆時 , 需要修改混淆 resources.arsc 資源映射表 的 全局字符串池 和 包數(shù)據(jù)下的 資源名稱字符串池 ;
一、resources.arsc 資源映射表 混淆
在上一篇博客 【Android 安裝包優(yōu)化】資源混淆 ( AAPT2 資源編譯工具 | resources.arsc 資源映射表 工作機(jī)制 ) 中分析了 Android 應(yīng)用根據(jù) ID 查找資源的機(jī)制 , 是從 resources.arsc 資源映射表 中查找相應(yīng)資源的路徑 ;
資源混淆 的本質(zhì)就是將 resources.arsc 資源映射表 中的 資源路徑 進(jìn)行混淆 , 并且相應(yīng)的將對應(yīng)的 資源移動到對應(yīng)的混淆后的路徑 中 ;
資源混淆步驟 :
① 解析二進(jìn)制文件 : 解析 resources.arsc 資源映射表混淆 二進(jìn)制文件 , 獲取字符串池中的資源名稱字符串 ;
② 混淆資源路徑 : 將字符串池中的資源路徑使用無意義的字符串替換 ;
③ 修改資源路徑 : 根據(jù) ② 步驟中的無意義字符串路徑 , 修改 res 中目錄中的資源路徑 ;
④ 打包 : 使用 7-Zip 工具進(jìn)行打包 , 對齊 , 簽名 , 然后就可以發(fā)布了 ;
ArscBlamer 開源項目 : https://github.com/google/android-arscblamer
;
Google 給出了解析 resources.arsc 資源映射表 的開源項目 ArscBlamer , 該工具一個命令行工具 , 用于解析 Android 應(yīng)用的 resources.arsc 資源映射表文件 , 并且可以提取其中的相關(guān)信息 ;
借助 ArscBlamer 工具 , 可以輸出所有資源的配置信息 , 查看 類型 , 變量 , 大小 , 空實例 , 實例個數(shù) , 屏幕像素密度 等資源信息 ;
Android 源碼中也有相關(guān)內(nèi)容 : frameworks/base/include/androidfw/ResourceTypes.h
二、resources.arsc 資源映射表二進(jìn)制格式分析
resources.arsc 資源映射表 二進(jìn)制文件結(jié)構(gòu) :
-
文件頭 : 文件開始是 文件頭 , 包含 121212 字節(jié)的數(shù)據(jù) ;
-
全局字符串池 : 文件頭后面是字符串池 , 內(nèi)容是字符串 , 如 “res/mipmap/ic_launcher.png” , “res/layout/activity_main.xml” 等字符串 ;
-
包數(shù)據(jù) : 字符串池后面是包數(shù)據(jù) , 其中包含包名等數(shù)據(jù) ;
包數(shù)據(jù)中包含了 資源類型字符串池 , 資源名稱字符串池 , 以及資源分組匹配規(guī)范 等數(shù)據(jù) , 這里我們關(guān)注 資源類型字符串池 和 資源名稱字符串池 ;
-
類型字符串池 : 包含了資源的類型 , “anim” 動畫 , “attr” 屬性 , “drawable” 圖片 , “color” 顏色 , “mipmap” 圖片 , “l(fā)ayout” 布局 等類型字符串 ; 是 R.layout.activity_main.xml 中的中間部分組成 ;
-
名稱字符串池 : 資源的名稱 , 如 “activity_main” , “ic_launcher” 等資源的名稱 , 注意該名稱不帶后綴 ; 是 R.layout.activity_main.xml 中的后面部分組成 ;
-
Spec 配置表 : 包含資源類型 ID , 指向資源類型字符串池 , 每個資源類型都有對應(yīng)的一塊配置數(shù)據(jù)塊 , 數(shù)據(jù)塊中的內(nèi)容就是該類型的具體的每個資源的名稱 ; drawable 類型有一個配置數(shù)據(jù)塊 , layout 類型也對應(yīng)有一個配置數(shù)據(jù)塊 ; 每個資源類型數(shù)據(jù)塊都包含以下內(nèi)容 , Spec 配置表中有若干如下數(shù)據(jù)塊 ;
Spec 配置表 的 drawable 資源類型對應(yīng)的數(shù)據(jù)塊中存儲這資源 ID , 給定一個資源 ID , 如 R.drawable.ic_launcher , 在該 Spec 配置表 中查找到 該 ID , 然后 查找其對應(yīng)的路徑 , 從 資源名稱字符串池 找到 ID 對應(yīng)的字符串 ic_launcher , 則可以得到其最終路徑 res/drawable/ic_launcher ;
resources.arsc 資源映射表格式 :
給定一個 int 類型的 ID 常量 , 到 resources.arsc 資源映射表 中查詢對應(yīng)的文件路徑 ;
要查找的文件的實際路徑在字符串池中 , 如 “res/mipmap/ic_launcher.png” , “res/layout/activity_main.xml” 等字符串文件路徑地址 ;
給定的 ID 如 : “kim.hsl.svg.R.layout.activity_main” , 可以分為 333 部分 ,
- 包數(shù)據(jù) “kim.hsl.svg.R” ,
- 資源類型 “l(fā)ayout” ,
- 資源名稱 “activity_main”
資源混淆時 , 需要修改混淆 resources.arsc 資源映射表 的 全局字符串池 和 包數(shù)據(jù)下的 資源名稱字符串池 ;
三、參考資料
參考官方文檔 :
- 縮減、混淆處理和優(yōu)化應(yīng)用 : https://developer.android.google.cn/studio/build/shrink-code
- APK 構(gòu)建流程 : https://developer.android.google.cn/studio/build
- AAPT2 工具官方文檔 : https://developer.android.google.cn/studio/command-line/aapt2?hl=zh_cn
- ArscBlamer 開源項目 : https://github.com/google/android-arscblamer
;
Android 源碼中資源類型相關(guān)內(nèi)容 : frameworks/base/include/androidfw/ResourceTypes.h
參考之前的博客資源 :
- 【Android 安全】DEX 加密 ( ProGuard 混淆 | -keepclassmembers 混淆效果 | -keepclasseswithmembernames 混淆效果 )
- 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的報錯信息 | Proguard 混淆映射文件 mapping.txt )
- 【Android 安全】DEX 加密 ( Proguard 混淆 | 將混淆后的報錯信息轉(zhuǎn)為原始報錯信息 | retrace.bat 命令執(zhí)行目錄 | 暴露更少信息 )
- 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的報錯信息 | Proguard 混淆映射文件 mapping.txt )
博客資源 :
-
GitHub 項目源碼 : https://github.com/han1202012/SVG
-
下載地址 :
總結(jié)
以上是生活随笔為你收集整理的【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 安装包优化】资源混淆
- 下一篇: 【Android 安装包优化】资源混淆