授人与鱼不如授人与渔,作为初学者,最重要的是学会查看官方文档,自主学习。

首先放上google官方文档对dex解释的链接,里面相当详细的介绍了dex的格式的组成。

https://source.android.google.cn/devices/tech/dalvik/dex-format#header-item

上一篇文章解析了header_item,今天来解析map_list,老规矩,先查看map_list定义格式

size uint          列表的大小(以条目数表示)
list    map_item[size]  列表的元素

map_item格式

type ushort  项的类型;见下表
unused  ushort  (未使用)
size    uint    在指定偏移量处找到的项数量
offset  uint    从文件开头到相关项的偏移量

类型格式

header_item  TYPE_HEADER_ITEM    0x0000  0x70
string_id_item  TYPE_STRING_ID_ITEM 0x0001  0x04
type_id_item    TYPE_TYPE_ID_ITEM   0x0002  0x04
proto_id_item   TYPE_PROTO_ID_ITEM  0x0003  0x0c
field_id_item   TYPE_FIELD_ID_ITEM  0x0004  0x08
method_id_item  TYPE_METHOD_ID_ITEM 0x0005  0x08
class_def_item  TYPE_CLASS_DEF_ITEM 0x0006  0x20
call_site_id_item   TYPE_CALL_SITE_ID_ITEM  0x0007  0x04
method_handle_item  TYPE_METHOD_HANDLE_ITEM 0x0008  0x08
map_list    TYPE_MAP_LIST   0x1000  4 + (item.size * 12)
type_list   TYPE_TYPE_LIST  0x1001  4 + (item.size * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST    0x1002  4 + (item.size * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM    0x1003  4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM    0x2000  隐式;必须解析
code_item   TYPE_CODE_ITEM  0x2001  隐式;必须解析
string_data_item    TYPE_STRING_DATA_ITEM   0x2002  隐式;必须解析
debug_info_item TYPE_DEBUG_INFO_ITEM    0x2003  隐式;必须解析
annotation_item TYPE_ANNOTATION_ITEM    0x2004  隐式;必须解析
encoded_array_item  TYPE_ENCODED_ARRAY_ITEM 0x2005  隐式;必须解析
annotations_directory_item  TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006  隐式;必须解析
hiddenapi_class_data_item   TYPE_HIDDENAPI_CLASS_DATA_ITEM  0xF000  隐式;必须解析

有了格式,接下来定义我们需要的结构体

herder_item

#define IMAGE_SIZEOF_DEX_FILE 8
#define IMAGE_SIZEOF_DEX_SIGNATURE 20
typedef struct  _IMAGE_DEX_HEADER
{BYTE magic[IMAGE_SIZEOF_DEX_FILE]; 。DWORD checksum;    BYTE signature[IMAGE_SIZEOF_DEX_SIGNATURE]; DWORD file_size;    DWORD header_size;  DWORD endian_tag;   DWORD link_size;    DWORD link_off; DWORD map_off;  DWORD string_ids_size;  DWORD string_ids_off;   DWORD type_ids_size;    DWORD type_ids_off;DWORD proto_ids_size;    DWORD proto_ids_off;    DWORD field_ids_size;   DWORD field_ids_off;DWORD method_ids_size;  DWORD method_ids_off;   DWORD class_defs_size;  DWORD class_defs_off;DWORD data_size;       DWORD data_off;
}IMAGE_DEX_HEADER, * PIMAGE_DEX_HEADER;

map_item

typedef struct _IMAGE_MAP_ITEM
{WORD type; WORD    unused;DWORD    size;   DWORD   offset;
}IMAGE_MAP_ITEM, * PIMAGE_MAP_ITEM;

读取结构体

DWORD my_ReadFile(CString IpzFile)
{FILE* pFile = NULL;DWORD fileSize = 0;LPVOID pTempFileBuffer = NULL;/* 打开文件*/pFile = fopen(IpzFile, "rb");if (!pFile){MessageBox(0, TEXT("打开文件失败"), TEXT("信息"), 0);return fileSize;}/*跳转到文件尾 //因为map_list数据在较后面一部分,所以需要读取全部的数据*/fseek(pFile, 0, SEEK_END);/*得到文件的大小*/fileSize = ftell(pFile);if (fileSize == -1){fclose(pFile);return fileSize;}/*跳转到文件头部*/rewind(pFile);//分配空间pTempFileBuffer = (LPVOID)malloc(fileSize);if (!pTempFileBuffer){//失败关闭并返回fclose(pFile);return fileSize;}size_t n = fread(pTempFileBuffer, fileSize, 1, pFile);if (!n){fclose(pFile);free(pTempFileBuffer);return 0;}fclose(pFile);//强转类型PIMAGE_DEX_HEADER dex_header=(PIMAGE_DEX_HEADER)pTempFileBuffer;//dex_header->map_off通过结构体指针获取到map_list的偏移位置,根据上面的map_list结构可以知道,前面的四个字节是列表的大小,所以转换成LPWORD类型的指针,(DWORD)pTempFileBuffer代表文件开始的位置LPDWORD map_size=(LPDWORD)((DWORD)pTempFileBuffer + dex_header->map_off)//(map_size+1) DWORD类型的指针加1代表地址值加4,刚好是map_item结构体数组的位置PIMAGE_MAP_ITEM virtualAddress_map= (PIMAGE_MAP_ITEM)(map_size+1);//通过循环可以获取到每一个map_item的值for (size_t i = 0; i < *map_size; i++){DWORD  type=(virtualAddress_map+i)->type;   DWORD size=(virtualAddress_map+i)->size; DWORD   offset=(virtualAddress_map+i)->offset;}return ;
}

根据type的值转换相对应的类型

定义数组

extern LPSTR mType_Text[21] = { "header_item","string_id_item","type_id_item","proto_id_item","field_id_item",
"method_id_item","class_def_item","call_site_id_item","method_handle_item","map_list","type_list",
"annotation_set_ref_list","annotation_set_item","class_data_item","code_item","string_data_item","debug_info_item",
"annotation_item","encoded_array_item","annotations_directory_item"   ,"hiddenapi_class_data_item" };

转换函数

char* getMapType(DWORD index)
{char* str = NULL;switch ( index){case 0x0000:str = mType_Text[0];break;case 0x0001:str = mType_Text[1];break;case 0x0002:str = mType_Text[2];break;case 0x0003:str = mType_Text[3];break;case 0x0004:str = mType_Text[4];break;case 0x0005:str = mType_Text[5];break;case 0x0006:str = mType_Text[6];break;case 0x0007:str = mType_Text[7];break;case 0x0008:str = mType_Text[8];break;case 0x1000:str = mType_Text[9];break;case 0x1001:str = mType_Text[10];break;case 0x1002:str = mType_Text[11];break;case 0x1003:str = mType_Text[12];break;case 0x2000:str = mType_Text[13];break;case 0x2001:str = mType_Text[14];break;case 0x2002:str = mType_Text[15];break;case 0x2003:str = mType_Text[16];break;case 0x2004:str = mType_Text[17];break;case 0x2005:str = mType_Text[18];break;case 0x2006:str = mType_Text[19];break;default:str = mType_Text[20];break;}return str;
}

dex文件格式------map_list解析相关推荐

  1. Dex文件格式扫描器:特征API的检测和扫描-小工具一枚(转载)

    之前由于工作需求,会分析大量APP的某些特殊API,对特殊API分析每次都需要打开JEB->查找特定API->分析流程-.无奈APP是无穷的,而精力是有限的.于是发挥了人类最本能的天性-- ...

  2. Dex文件格式扫描器:特征API的检测和扫描(小工具一枚)

    2.0 2.0使用更方便,提供了几个API进行扫描调用 具体参考:https://github.com/Rorschach123/DexScanner 1.0 之前由于工作需求,会分析大量APP的某些 ...

  3. 顶象App加固技术解析:DEX文件格式的详解

    Android应用的源代码主要分为java与C/C++两部分,其中java编译后的文件是DEX文件,也是Android Dalvik虚拟机运行的程序,因此也是基于Android平台的虚机应用很难绕过的 ...

  4. Dex文件内容解析APK相关信息

    Dex文件格式 我们都知道Android项目在构建的时候,会将class文件的jar包通过dx工具将其转化成dex文件,目的是将所有的class文件整合到一个dex文件中,这样的目的是降低冗余,因为每 ...

  5. MP4 | MP4文件格式的解析

    参考资料: 1.MP4文件格式的解析,以及MP4文件的切割算法 2.mp4文件解析(纯c解析代码) 3.MP4文件格式详解--元数据moov(一)mvhd box 4.音视频解封装:MP4核心Box详 ...

  6. java 解析mp4_MP4文件格式的解析,以及MP4文件的分割算法

    MP4文件格式的解析,以及MP4文件的分割算法 mp4应该算是一种比较复杂的媒体格式了,起源于QuickTime.以前研究的时候就花了一番的功夫,尤其是如何把它完美的融入到视频点播应用中,更是费尽了心 ...

  7. elf文件格式实例解析

    试验环境:archlinux 速龙3000+(即x86兼容32位处理器) 必须软件:gcc binutils 参考资料: System V application binary interface E ...

  8. ply补全为立方体_PLY文件格式及其解析 | 学步园

    Ply文件格式是Stanford大学开发的一套三维mesh模型数据格式,图形学领域内很多著名的模型数据,比如Stanford的三维扫描数据库[1](其中包括很多文章中会见到的Happy Buddha. ...

  9. AVI文件格式完整解析

    首先AVI是一种RIFF文件,所以先介绍一下RIFF文件 一.RIFF文件简介 RIFF是Microsoft提出的一种多媒体文件的存储方式,不同编码的音频.视频文件,可以按照它定义的存储规则保存.记录 ...

  10. [转]MP4文件格式的解析及分割算法

    目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准.随后MP4概念被转移到视频上,对应的是MPEG-4标准.而现在我们流行的叫法,多半是指能播放M ...

最新文章

  1. 自动调整速率的Actor设计模式
  2. iis服务器配置php项目,Windows7下IIS+php配置教程
  3. gh0st源码分析与远控的编写(一)
  4. install ADT plugin
  5. 达内培训c语言,【达内C  培训教程】C语言实例 分数之和
  6. python网络爬虫(三)数据抓取
  7. python扫雷游戏课程设计小组任务计划与分配表_Python开源扫雷游戏由网瘾少年制作,转手后月入18K,附赠所有源文件...
  8. java后台传一个对象到前台_前台判断对象中的一个布尔值_前后台分离的项目中,如何优雅的传输boolean类型的参数...
  9. 《代码敲不队》第三次作业:团队项目的原型设计
  10. VMware 大中华区原厂认证讲师(大陆地区)2019-8-19 更新
  11. 《Ray Tracing in One Weekend》——Chapter 2: The vec3 class
  12. 亿级流量峰值没在怕,“缓存”技术来减压
  13. Arts 第九周(5/13 ~ 5/19)
  14. 双线性对映射 概念理解
  15. 20张动图全析四大显微分析(SEM、TEM、AFM、STM)工作原理!
  16. 2022清明节放假安排来了,制定假日计划可用云便签软件
  17. 概要设计 重要性_艺术留学——服装设计
  18. java项目 无法重命名_重命名项不起作用
  19. 表示自己从头开始的句子_表示一切从头开始的唯美句子38条
  20. php 读doc_PHP读取DOC 文件

热门文章

  1. 人民币与美元汇率兑换程序
  2. 企业用企业邮箱的好处是什么?企业邮箱支持哪些功能?
  3. Windows环境下32位汇编语言程序设计(典藏版) 高清完整
  4. 微信小程序中 三元表达式
  5. yaml UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xba in position 15: illegal multibyte sequen
  6. mysql spatial 函数_MySQL中spatial基本操作
  7. 如何学会学习——读唐老师博文有感
  8. 洛谷 P4200 千山鸟飞绝平衡树
  9. 请写出至少五个块级元素_以下属于行内块元素的是()
  10. Flash打造拟真生态水族鱼缸