日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )

發(fā)布時間:2025/6/17 Android 27 豆豆

文章目錄

  • 一、resources.arsc 資源映射表文件格式
  • 二、頭文件 數(shù)據(jù)格式
  • 三、全局字符串池 數(shù)據(jù)格式
  • 四、包數(shù)據(jù) 數(shù)據(jù)格式
    • 1、包頭 數(shù)據(jù)格式
    • 2、資源類型字符串池 數(shù)據(jù)格式
    • 3、資源名稱字符串池 數(shù)據(jù)格式
  • 五、參考資料





一、resources.arsc 資源映射表文件格式



上一篇博客 【Android 安裝包優(yōu)化】資源混淆 ( resources.arsc 資源映射表混淆 | resources.arsc 資源映射表二進制格式分析 | 混淆全局字符串池和資源名稱字符串池 ) 對 resources.arsc 資源映射表 的二進制文件格式進行了分析 , 得出如下結論 :

資源混淆時 , 需要修改混淆 resources.arsc 資源映射表 的 全局字符串池 和 包數(shù)據(jù)下的 資源名稱字符串池 ;


全局字符串池中是 資源 的文件路徑 , “res/drawable/ic_launcher.png” , 包數(shù)據(jù)中的 資源名稱字符串池 , 存儲的文件的名稱 “ic_launcher” ;

資源類型字符串池 , 不用進行混淆 , 在根據(jù)資源 ID 查找資源時 , 不會用到該數(shù)據(jù)塊中的數(shù)據(jù) ;


使用二進制文件查看器查看 resources.arsc 資源映射表 文件 :


部分數(shù)據(jù)列舉 :576576576 字節(jié) ;

02 00 0C 00 B8 BC 05 00 01 00 00 00 01 00 1C 00 98 9E 00 00 0E 03 00 00 00 00 00 00 00 01 00 00 54 0C 00 00 00 00 00 00 00 00 00 00 0B 00 00 00 17 00 00 00 1B 00 00 00 27 00 00 00 15 01 00 00 66 01 00 00 B3 01 00 00 CD 01 00 00 DA 01 00 00 E9 01 00 00 EF 01 00 00 37 02 00 00 7D 02 00 00 BB 02 00 00 FE 02 00 00 4A 03 00 00 96 03 00 00 C6 03 00 00 F7 03 00 00 25 04 00 00 54 04 00 00 6F 04 00 00 8B 04 00 00 B7 04 00 00 D6 04 00 00 F4 04 00 00 23 05 00 00 46 05 00 00 66 05 00 00 8A 05 00 00 AB 05 00 00 CC 05 00 00 EC 05 00 00 2E 06 00 00 70 06 00 00 AB 06 00 00 EF 06 00 00 34 07 00 00 71 07 00 00 AA 07 00 00 E4 07 00 00 23 08 00 00 5B 08 00 00 94 08 00 00 D2 08 00 00 FE 08 00 00 2B 09 00 00 4D 09 00 00 70 09 00 00 9A 09 00 00 C5 09 00 00 F2 09 00 00 22 0A 00 00 53 0A 00 00 8C 0A 00 00 BB 0A 00 00 EA 0A 00 00 2A 0B 00 00 6A 0B 00 00 AA 0B 00 00 EA 0B 00 00 16 0C 00 00 4D 0C 00 00 7A 0C 00 00 A7 0C 00 00 ED 0C 00 00 31 0D 00 00 67 0D 00 00 9D 0D 00 00 D6 0D 00 00 03 0E 00 00 30 0E 00 00 6F 0E 00 00 AC 0E 00 00 E7 0E 00 00 1E 0F 00 00 5B 0F 00 00 98 0F 00 00 D5 0F 00 00 07 10 00 00 38 10 00 00 63 10 00 00 88 10 00 00 AE 10 00 00 D6 10 00 00 FB 10 00 00 25 11 00 00 66 11 00 00 A8 11 00 00 E1 11 00 00 0F 12 00 00 41 12 00 00 74 12 00 00 B0 12 00 00 ED 12 00 00 1C 13 00 00 4C 13 00 00 70 13 00 00 A1 13 00 00 D3 13 00 00 FA 13 00 00 1B 14 00 00 3D 14 00 00 61 14 00 00 82 14 00 00 A8 14 00 00 DB 14 00 00 03 15 00 00 20 15 00 00 41 15 00 00 67 15 00 00 97 15 00 00 D1 15 00 00 08 16 00 00 35 16 00 00 6C 16 00 00 A0 16 00 00 CD 16 00 00 04 17 00 00 38 17 00 00 63 17 00 00 9B 17 00 00 CE 17 00 00 F9 17 00 00 33 18 00 00 68 18 00 00 94 18 00 00 CA 18 00 00 FC 18 00 00 31 19 00 00 5F 19 00 00 93 19 00 00 C5 19 00 00



二、頭文件 數(shù)據(jù)格式



頭文件數(shù)據(jù) : 數(shù)據(jù)格式是 小端格式 , 低位存儲在低字節(jié)中 , 高位存儲在高字節(jié)中 , 如頭文件長度 0C 00 , 低字節(jié) 第 000 字節(jié)存儲 0C , 高字節(jié) 第 111 字節(jié)存儲 00 數(shù)據(jù) ; ( 小端格式可讀性差 )

02 00 0C 00 B8 BC 05 00 01 00 00 00


1. RES_TABLE_TYPE : 222 字節(jié) , 表示文件類型 , 在 frameworks/base/include/androidfw/ResourceTypes.h 源碼文件中定義 ;

enum {RES_NULL_TYPE = 0x0000,RES_STRING_POOL_TYPE = 0x0001,RES_TABLE_TYPE = 0x0002,RES_XML_TYPE = 0x0003,// Chunk types in RES_XML_TYPERES_XML_FIRST_CHUNK_TYPE = 0x0100,RES_XML_START_NAMESPACE_TYPE= 0x0100,RES_XML_END_NAMESPACE_TYPE = 0x0101,RES_XML_START_ELEMENT_TYPE = 0x0102,RES_XML_END_ELEMENT_TYPE = 0x0103,RES_XML_CDATA_TYPE = 0x0104,RES_XML_LAST_CHUNK_TYPE = 0x017f,// This contains a uint32_t array mapping strings in the string// pool back to resource identifiers. It is optional.RES_XML_RESOURCE_MAP_TYPE = 0x0180,// Chunk types in RES_TABLE_TYPERES_TABLE_PACKAGE_TYPE = 0x0200,RES_TABLE_TYPE_TYPE = 0x0201,RES_TABLE_TYPE_SPEC_TYPE = 0x0202,RES_TABLE_LIBRARY_TYPE = 0x0203 };

2 . 頭大小 : " 文件頭 " 的大小 , 121212 字節(jié) , 文件頭范圍如下 :


3 . 文件大小 : 整個 resources.arsc 資源映射表 文件的大小 , 單位 字節(jié) ;


4 . package 數(shù) : 一般情況下 , 一個應用只有一個 package 包 ; 正常情況下 , 該值是 111 ;





三、全局字符串池 數(shù)據(jù)格式



字符串池混淆注意事項 : 修改 " 全局字符串池 " , " 資源名稱字符串池 " 其最終的字符串數(shù)據(jù)塊字節(jié)數(shù) 必須是 444 的整數(shù)倍 , 如果最后不足 444 字節(jié) , 需要補 000 ;


藍色部分是 全局字符串池 頭文件部分 :


1 . RES_STRING_POOL_TYPE : 字符串池類型 , 222 字節(jié) ;


2 . 頭大小 : 222 字節(jié) ;


3 . 塊大小 : 444 字節(jié) , 如下數(shù)據(jù)塊大小 ;



4 . 字符串數(shù) : 444 字節(jié) , 字符串個數(shù) ; 包括所有的 圖片, 布局 等類型的資源對應的文件路徑 , 定義的 strings 字符串資源 , value 值 資源 等 ;


5 . style 數(shù) : 444 字節(jié) , 字符串的樣式 , 全局字符串池中的字符串樣式一般為空 ;


6 . 標記 : 444 字節(jié) , 用于標記字符串存儲在 resources.arsc 資源映射表 文件中的編碼方式 , UTF-8 或 UTF-16 兩種編碼方式 ;


7 . 字符串起始位置 : 444 字節(jié) , 標記 全局字符串池 中的字符串開始位置 , 000 索引位置是 RES_STRING_POOL_TYPE 第一個字節(jié)位置 ;


8 . style 起始位置 : 444 字節(jié) , 標記 全局字符串池 中的字符串風格數(shù)據(jù)的開始位置 , 000 索引位置是 RES_STRING_POOL_TYPE 第一個字節(jié)位置 ;


9 . 字符串偏移數(shù)組 : int 類型數(shù)組 , 每個 index 索引的 int 數(shù)組的元素值是 對應 index 索引的 字符串 對應的 首元素位置下標 ;





四、包數(shù)據(jù) 數(shù)據(jù)格式





1、包頭 數(shù)據(jù)格式


包數(shù)據(jù)中的包頭數(shù)據(jù)格式 :

1 . RES_TABLE_PACKAGE_TYPE : 資源包類型格式 , 222 字節(jié) ;


2 . 頭大小 : 222 字節(jié) ;


3 . 塊大小 : 444 字節(jié) ;


4 . 包 ID : 444 字節(jié) , 包名對應的 ID 常量標識 ;


5 . 包名 : 256256256 字節(jié) , 解析出來就是對應的再清單文件中配置的包名 , “kim.hsl.svg” ;


6 . 資源類型字符串池偏移 : 444 字節(jié) , 從 RES_TABLE_PACKAGE_TYPE 的首字節(jié)作為 000 位置開始計數(shù) , 到 " 資源類型字符串池 " 的首字節(jié)的字節(jié)索引值 , 如 : 整個包頭占 2000 字節(jié) , 那么包頭索引值是 000 ~ 199919991999 , " 資源類型字符串池 " 的首字節(jié)偏移就是 200020002000 ;


7 . lastPublicType : 444 字節(jié) , 默認為 000 , 無意義 ;


8 . 資源關鍵字字符串池偏移 : 444 字節(jié) , 就是 " 資源名稱字符串池 " 的偏移 , 從 RES_TABLE_PACKAGE_TYPE 的首字節(jié)作為 000 位置開始計數(shù) , 中間隔著 包頭數(shù)據(jù) 和 資源類型字符串池 兩個數(shù)據(jù)塊 ;


9 . lastPublicType : 444 字節(jié) , 默認為 000 , 無意義 ;


10 . typeIdOffset : 444 字節(jié) ;



2、資源類型字符串池 數(shù)據(jù)格式


資源類型字符串池 與 " 全局字符串池 " 格式相同 , 參考上面的 " 三、全局字符串池 數(shù)據(jù)格式 " 章節(jié) ;



3、資源名稱字符串池 數(shù)據(jù)格式


資源名稱字符串池 與 " 全局字符串池 " 格式相同 , 參考上面的 " 三、全局字符串池 數(shù)據(jù)格式 " 章節(jié) ;





五、參考資料



參考官方文檔 :

  • 縮減、混淆處理和優(yōu)化應用 : https://developer.android.google.cn/studio/build/shrink-code
  • APK 構建流程 : 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 源碼中資源類型相關內容 : frameworks/base/include/androidfw/ResourceTypes.h

參考之前的博客資源 :

  • 【Android 安全】DEX 加密 ( ProGuard 混淆 | -keepclassmembers 混淆效果 | -keepclasseswithmembernames 混淆效果 )
  • 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的報錯信息 | Proguard 混淆映射文件 mapping.txt )
  • 【Android 安全】DEX 加密 ( Proguard 混淆 | 將混淆后的報錯信息轉為原始報錯信息 | retrace.bat 命令執(zhí)行目錄 | 暴露更少信息 )
  • 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的報錯信息 | Proguard 混淆映射文件 mapping.txt )

博客資源 :

  • GitHub 項目源碼 : https://github.com/han1202012/SVG

  • 下載地址 :

總結

以上是生活随笔為你收集整理的【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。