授人与鱼不如授人与渔,作为初学者,最重要的是学会查看官方文档,自主学习。
首先放上google官方文档对dex解释的链接,里面相当详细的介绍了dex的格式的组成。
https://source.android.google.cn/devices/tech/dalvik/dex-format#header-item
上一篇文章解析了type_ids,今天来解析dex中的字符串,老规矩,先来看官方文档的介绍。
type_ids_size uint 类型标识符列表中的元素数量,最多为 65535
type_ids_off uint 从文件开头到类型标识符列表的偏移量;如果 type_ids_size == 0(不可否认是一种奇怪的极端情况),则该值为 0。该偏移量(如果为非零值)应该是到 type_ids 区段开头的偏移量。
type_ids_size 记录了标识符的数量 4字节大小
type_ids_off记录了type_ids区段开头的偏移量 4个字节大小
type_ids区段格式:
type_ids type_id_item[]
type_id_item格式:
descriptor_idx uint 此类描述符字符串的 string_ids 列表中的索引。该字符串必须符合上文定义的 TypeDescriptor 的语法。
可以看到type_id_item结构非常简单,就是一个int类型的数组。这个数组记录了上篇文章中string_ids的索引。
定义结构体
typedef struct _IMAGE_TYPE_ITEM
{
DWORD type_idx; //ushort type_ids 列表中的索引
}IMAGE_TYPE_ITEM, * PIMAGE_TYPE_ITEM;
定义结构体只是为了看着清晰一点,便于理解
开始解析
header_item获取这里就不在讲述了,header_item->type_ids_size得到数组的个数,通过header_item->type_ids_off来获取偏移,与开始相加就得到了数组指针,有了数组指针,遍历数组很简单,这里不开展。
下面看代码:
//第一个参数 header_item 头部指针
//第二个参数 virtualAddress_string 字符串指针
//第三个参数 virtualAddress_type 上面定义的结构体指针
//第四个参数 index 索引获取第几个的值
char* getString(PIMAGE_DEX_HEADER IpParameter, PDWORD virtualAddress_string, PIMAGE_TYPE_ITEM virtualAddress_type, DWORD index)
{
return getString(IpParameter, virtualAddress_string, (virtualAddress_type + index)->type_idx);
}
|