Android Dex文件格式

从一个函数抽取壳了解到,对一个dex文件的函数抽取实现原理:在dex文件结构中函数之间的的数据是通过不同的字段,类型等id连接到一起的,如果我们将这个索引id置为空,那么他的dex显示时,会只有这个方法名,而里面的函数为空,需要注意的是修改了dex文件之后,需要重新计算签名和效验值。

dex文件格式总体分为

    头文件 ,索引区,data区

Header结构

struct header_item

{

      ubyte[8] magic;//文件魔数

      unit checksum;//校验

      ubyte[20] siganature;//签名

      uint file_size;//文件大小

      uint header_size;//头文件大小

      unit endian_tag;//一般为固定值0x12345678

      uint link_size;//链接数据大小

      uint link_off;//链接数据偏移

      uint map_off;//data区的数据集合

      uint string_ids_size;//字符串数量

      uint string_ids_off;//字符串偏移

      uint type_ids_size;//所有类型数量

      uint type_ids_off;//类型偏移

      uint proto_ids_size;//方法参数信息数量

      uint proto_ids_off;//偏移

      uint method_ids_size;//方法信息数量

      uint method_ids_off;//偏移

      uint class_defs_size;//类信息个数

      uint class_defs_off;//偏移

      uint data_size;//数据大小

      uint data_off;//偏移

}

magic 

魔数 dex文件魔数为0x64 0x65 0x78 0x0a 0x30 0x33 0x35 0x00

checksum

文件校验码 ,使用alder32 算法校验文件除去 maigc ,checksum 外余下的所有文件区域 ,用于检

查文件错误 。

signature 

 使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件区域 ,

用于唯一识别本文件 。


具体的数据结构可以参考四哥的Android逆向之旅—解析编译之后的Dex文件格式 | 尼古拉斯.赵四

总结

    dex的文件格式,其实是将代码结构零件化,string_id 主要是所以的字符串信息,type_id 是类型信息, 比如class类,返回类型,基本类型等等,比如 Landroid/app/Activity; Landroid/os/Bundle;最终是数据通过类型接的索引id相互串联起来,构造出完整的代码视图

你可能感兴趣的:(Android Dex文件格式)