接着上篇,思考下面2个问题
1、为什么会出现情况 entryOffset[i] == -1 ?
2、这个entryOffset[i] 指的是什么?
看回之前的条件: type == Header.TYPE_TYPE , 这个Header.TYPE_TYPE 在代码的定义如下
到此看到这,如果对Resources.arsc没有了解的话,可能就会完全不懂为什么会是这样的。对此,建议百度有很多人对Resources.arsc有过讲解。
在此贴一个图
Resource.png回顾上次总结出来的图
细心的同学可能会发现 Resource.arsc 没有LibraryType对应的格式,其实是上图中少了而已。
因为:LibraryType对应的是资源共享库 , 一般应用比较少使用到, 有兴趣可以自己查找资料
有兴趣了解上面的可以去查看ResourceTypes.h
回归 type == Header.TYPE_TYPE 代表当是当前的块(图中绿色部分)的时候,执行 readTableType() 。
回到问题2上, entryOffset[i] 在代码中的赋值如下图
看不懂其实没有关系,我们跟着图来。 已知这个操作是对图中绿色部分(特指:我们目前研究的部分)
我们发现, entryOffsets 的赋值是读数组, 我们回到图上不难发现,这个操作对应的是图中的ResTable_entry偏移数组
整理目前已知,得entryOffset[i] 指的就是图中的ResTable_entry偏移数组 即: entryOffset[0] 表示的是第一个ResTable_entry启始的位置的偏移量
对上面代码观察细心的同学应该会发现mIn.skipBytes(2)这个操作移动的只有2个字节,而上面图Resource.png 明明说的是3个字节
下面给出010上对resources.arsc的查看结果, 可以清晰的看到红框部分是2个字节。把2个图结合起来,保留3位,uchar res0 占1位,对应的是判断条件 typeFlags == 1 翻译过来是“检测到稀有类型标志”, ushort res1 占2位对应的是mIn.skipBytes(2)
010.png整理上述, 可以得出,当 entryOffset[i] == -1 即:会生成 APKTOOL_DUMMY_
回归问题
1、 entryOffset[i] == -1 的情况是:是不明确的
2、entryOffset[i] 指的是ResTable_entry偏移数组的偏移量
附图加深理解:
如图可得(只列举2个):
entryOffsets[0] = 0 ,entryOffsets[1] = 28
ResTable_entry[0] = mapEnty[0] , ResTable_entry[1] = mapEntry[1]
ResTable_type_type[0] 的位置是 25B18h = 154392 (16转10进制)
entriesStart = 2028
补充一个知识:偏移量:把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为"有效地址或偏移量"
有: header+entriesStart + entryOffsets[i] = ResTable_entry[i]
ResTable_entry[0] 的位置: 154392+2028+0 = 156420 ===> 26304h
ResTable_entry[1] 的位置: 154392+2028+28 = 156448 ===> 26320h
网友评论