Android加壳与脱壳(9)—— 一次manifest文件修复
大约 2 分钟
1.前言
- 某个manifest文件发现jadx和apktool均不能反编译,用jadx打开是这样的
- 仔细一看说的应该是字符串的起始位置不对,应该是0x654,实际上是0x650
- 但确实不太了解manifest的结构于是搜了一下相关的解决办法但都没法解决这个manifest文件的问题,于是乎决定自己把manifest的格式看一遍
- 这里参考的是**MindMac** 大佬写的文章中的格式,贴一个大佬的图
- 从头开始配合 010 editor提供的模板进行分析
2.分析
2.1 魔术和文件头
- 检验了一下都是没问题的
2.2 stringChunk
- String Chunk 的标识,值为 0x001C0001 没问题
- String Chunk的大小:0x6b38 没问题
- string chunk内容区间 (0x08开始 加上面的大小): 0x08 - 6b40 没问题
- 字符串个数 :395个 从offset中的个数和实际个数检查都 没问题
- 字符串起始位置:这里要注意字符串其实位置实际上是1ch中的偏移加0x8(即stringChunk的起始位置)
- 即0x64c + 0x8 = 0x654
- 这里其实就出现了jadx里报错的0x654
- 去看一下0x654的内容,确实是一个字符串,但是发现前面有4个字节在manifest的模板里是找不到的
- 看了其他几个正常反编译的manifest也发现string offsets后面应该直接跟string pool(实际的字符串内容),因为大多数manifest都没有style所以style pool offset的偏移item是没有的
- 所以感觉应该是这4个00 导致的问题
3.复原
- 因为可能是这4个字节的问题所以直接将其删除
- 但是删除会影响
- 整个文件大小: 0xf6a84 - 0x4 = 0xf6a80
- String Chunk的大小: 0x6b38h - 0x4 = 0x6b34
- 然后恢复真正的**stringPooloffset:**0x648
- 将三个字段修复好后脱到jadx中 反编译成功!!!
4.manifest文件防护
- 总结下反编译失败的原因就是在string offsets和string pool中间加了4个00 然后修改:
- 整个文件大小加4
- String Chunk的大小加4
- stringPooloffset的大小加4
- 从而导致jadx反编译失败,但安卓系统的解析应该不会受到影响
- 所以一个manifest防护的思路就诞生了
- 不过目前的思路只能是打包后一个apk后将manifest文件拿出来进行修改后重新打包进行签名
- manifest文件和脚本:
链接:https://pan.baidu.com/s/1Qo4cfLHc3ZYElBR1qdhMog 提取码:13f7
用法可见:
https://github.com/Sp1keeeee/manifestGuard
5.参考
https://bbs.pediy.com/thread-194206.htm
https://bbs.pediy.com/thread-272045.htm