`
836811384
  • 浏览: 548839 次
文章分类
社区版块
存档分类
最新评论

Android 可执行文件

 
阅读更多
简介

可执行文件是操作系统的基础,它反映着系统的运行机制,Android系统的可执行文件也是如此。

Apk

Apk是Android Package的缩写,实际上Apk文件就是一个zip压缩包,使用zip格式解压缩软件对apk文件进行解压,会发现它由一些图片资源与其它文件

组成,并且每个apk文件中包含一个classes.dex,它是Dalvik可执行文件。

dex 文件格式

在Android系统中,dex文件是可以直接在Dalvik虚拟机中加载运行的文件。通过ADT,经过复杂的编译,可以把java源代码转换为dex文 件。 那么这个文件的格式是什么样的呢?为什么Android不直接使用class文件,而采用这个不一样文件呢?其实它是针对嵌入式系统优化的结 果,Dalvik虚拟机的指令码并不是标准的Java虚拟机指令码,而是使用了自己独有的一套指令集。如果有自己的编译系统,可以不生成class文件, 直接生成dex文件。dex文件中共用了很多类名称、常量字符串,使它的体积比较小,运行效率也比较高。但归根到底,Dalvik还是基于寄存器的虚拟机 的一个实现。

Dex文件头主要包括校验和以及其他结构的偏移地址和长度信息。

字段名称 偏移值 长度 描述
magic 0x0 8 'Magic'值,即魔数字段,格式如”dex/n035/0”,其中的035表示结构的版本。
checksum 0x8 4 校验码。
signature 0xC 20 SHA-1签名。
file_size 0x20 4 Dex文件的总长度。
header_size 0x24 4 文件头长度,009版本=0x5C,035版本=0x70。
endian_tag 0x28 4 标识字节顺序的常量,根据这个常量可以判断文件是否交换了字节顺序,缺省情况下=0x78563412。
link_size 0x2C 4 连接段的大小,如果为0就表示是静态连接。
link_off 0x30 4 连接段的开始位置,从本文件头开始算起。如果连接段的大小为0,这里也是0。
map_off 0x34 4 map数据基地址。
string_ids_size 0x38 4 字符串列表的字符串个数。
string_ids_off 0x3C 4 字符串列表表基地址。
type_ids_size 0x40 4 类型列表里类型个数。
type_ids_off 0x44 4 类型列表基地址。
proto_ids_size 0x48 4 原型列表里原型个数。
proto_ids_off 0x4C 4 原型列表基地址。
field_ids_size 0x50 4 字段列表里字段个数。
field_ids_off 0x54 4 字段列表基地址。
method_ids_size 0x58 4 方法列表里方法个数。
method_ids_off 0x5C 4 方法列表基地址。
class_defs_size 0x60 4 类定义类表中类的个数。
class_defs_off 0x64 4 类定义列表基地址。
data_size 0x68 4 数据段的大小,必须以4字节对齐。
data_off 0x6C 4 数据段基地址

odex文件格式

odex是OptimizedDEX的缩写,表示经过优化的dex文件。

odex有两种存在的方式:一种是从apk程序中提取出来的,与apk文件存放在同一目录且文件后缀为odex的文件,这类odex文件多是Android ROM的系统程序;

另一种是dalvik-cache缓存文件,这类Odex文件仍然以dex作为后缀,存放在cache/dalvik-cache目录下,保存的形式为“apk路径@apk名@classes.dex”。


dex文件的验证

Android提供了一个专门验证与优化dex文件的工具dexopt,该软件是开源的,可以下载到源码,验证过程如下:


小结

了解了dex、odex文件格式,对Android程序本身有更深层次的认识。当然也可以通过修改dex中的执行路径从而破解程序,因为Android应用程序的代码都存储在dex文件中。

相关下载

实例以及工具源码下载

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics