且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-08-22 07:48:04

三、全局字符串池 数据格式


字符串池混淆注意事项 : 修改 " 全局字符串池 " , " 资源名称字符串池 " 其最终的字符串数据块字节数 必须是 4 44 的整数倍 , 如果最后不足 4 44 字节 , 需要补 0 00 ;



蓝色部分是 全局字符串池 头文件部分 :

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




1 . RES_STRING_POOL_TYPE : 字符串池类型 , 2 22 字节 ;



2 . 头大小 : 2 22 字节 ;



3 . 块大小 : 4 44 字节 , 如下数据块大小 ;

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




4 . 字符串数 : 4 44 字节 , 字符串个数 ; 包括所有的 图片, 布局 等类型的资源对应的文件路径 , 定义的 strings 字符串资源 , value 值 资源 等 ;



5 . style 数 : 4 44 字节 , 字符串的样式 , 全局字符串池中的字符串样式一般为空 ;



6 . 标记 : 4 44 字节 , 用于标记字符串存储在 resources.arsc 资源映射表 文件中的编码方式 , UTF-8 或 UTF-16 两种编码方式 ;



7 . 字符串起始位置 : 4 44 字节 , 标记 全局字符串池 中的字符串开始位置 , 0 00 索引位置是 RES_STRING_POOL_TYPE 第一个字节位置 ;



8 . style 起始位置 : 4 44 字节 , 标记 全局字符串池 中的字符串风格数据的开始位置 , 0 00 索引位置是 RES_STRING_POOL_TYPE 第一个字节位置 ;



9 . 字符串偏移数组 : int 类型数组 , 每个 index 索引的 int 数组的元素值是 对应 index 索引的 字符串 对应的 首元素位置下标 ;






四、包数据 数据格式




1、包头 数据格式


包数据中的包头数据格式 :


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


1 . RES_TABLE_PACKAGE_TYPE : 资源包类型格式 , 2 22 字节 ;



2 . 头大小 : 2 22 字节 ;



3 . 块大小 : 4 44 字节 ;



4 . 包 ID : 4 44 字节 , 包名对应的 ID 常量标识 ;



5 . 包名 : 256 256256 字节 , 解析出来就是对应的再清单文件中配置的包名 , “kim.hsl.svg” ;



6 . 资源类型字符串池偏移 : 4 44 字节 , 从 RES_TABLE_PACKAGE_TYPE 的首字节作为 0 00 位置开始计数 , 到 " 资源类型字符串池 " 的首字节的字节索引值 , 如 : 整个包头占 2000 字节 , 那么包头索引值是 0 00 ~ 1999 19991999 , " 资源类型字符串池 " 的首字节偏移就是 2000 20002000 ;



7 . lastPublicType : 4 44 字节 , 默认为 0 00 , 无意义 ;



8 . 资源关键字字符串池偏移 : 4 44 字节 , 就是 " 资源名称字符串池 " 的偏移 , 从 RES_TABLE_PACKAGE_TYPE 的首字节作为 0 00 位置开始计数 , 中间隔着 包头数据 和 资源类型字符串池 两个数据块 ;



9 . lastPublicType : 4 44 字节 , 默认为 0 00 , 无意义 ;



10 . typeIdOffset : 4 44 字节 ;




2、资源类型字符串池 数据格式


资源类型字符串池 与 " 全局字符串池 " 格式相同 , 参考上面的 " 三、全局字符串池 数据格式 " 章节 ;


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




3、资源名称字符串池 数据格式


资源名称字符串池 与 " 全局字符串池 " 格式相同 , 参考上面的 " 三、全局字符串池 数据格式 " 章节 ;



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





五、参考资料


参考官方文档 :


缩减、混淆处理和优化应用 : 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 命令执行目录 | 暴露更少信息 )

【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )


博客资源 :


GitHub 项目源码 : https://github.com/han1202012/SVG


下载地址 :