dex文件格式

结构体图:


之后说几个坑

  1. 数据类型分:u1,u2,u4,u8,sleb128,uleb128,uleb128p1。其中u几表示字节数,16进制数据前缀0x后缀h。sleb有符号uleb无符号,p1为+1。后面3个为dex特有leb128数据类型。用每字节最高位定下一字节是否算在本数据中,也就是每字节有效位为7位。dex数据为小端存储(header中指定)。
  2. dex只分header,索引结构区,data区。header中的各off均指向索引区。dex被映射为DexMapList结构(header中的mapoff)。该map中指定了头,索引区,以及各数据的文件偏移
  3. dex为了小,字串重复利用,被type等均用字串索引指向。位于data区,而date区的其他数据(如代码)等都用文件偏移指定。
  4. proto为方法元,表示的是方法的参和返回类型。
  5. class结构最复杂,第一层含类的基本信息,第二层是字段和方法信息,第三层是方法代码等详情。
  6. 破解时可以直接修改dex文件后修改效验值和sha。不用拆包为smali再打包。不过签名是必须的

ODEX是安卓上的应用程序apk中提取出来的可运行文件,即将APK中的classes.dex文件通过dex优化过程将其优化生成一个·dex文件单独存放,原APK中的classes.dex文件会保留。
这样做可以加快软件的启动速度,预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行。
俩种存在方式:

  1. cache/dalvik-cache目录下,命名为apk路径@apk名@classes.dex。用于加快程序读取速度
  2. 与apk存于同一目录,以.odex后缀,多是系统程序。

还有一张看雪的: