Jimmy Chen

A Programmer

(原创)Odex文件二进制分析

  最近在看ART虚拟机相关的内容,稍微有了解的都能知道/data/dalvik-cache下的.dex后缀的文件和odex文件实际上都是修改过的ELF文件,网上有很多说明,但是貌似都没有找到一篇对一个odex或者说oat文件做分析的。所以博主这里就想着尝试对odex文件做一个简单分析。

odex文件总体信息

  这里博主拿SystemUI的oat文件(/data/dalvik-cache/arm64/system@product@priv-app@[email protected]@classes.dex)做例子,下面是通过readelf -e system@product@priv-app@[email protected]@classes.dex得出的ELF header、Section header、Program header以及Section到Segmemnt的映射关系如下所示

《(原创)Odex文件二进制分析》

《(原创)Odex文件二进制分析》

首先我们来看ELF header信息

这里我们先把通过readelf读出来的信息贴出来

下面我们将代码中的ELF头定义贴出来

最后是通过010Editor使用十六进制显示的内容

《(原创)Odex文件二进制分析》

通过上面三个信息的对比,很多信息就很明显了有木有

  • 首先代码中的unsigned char e_ident[EI_NIDENT];的定义对应readelf信息的Magic,前面四个字节是固定的,定义如下:

随后紧接着的是文件的类型,这里是0x02,便是的是64位文件

随后是文件字节排布的类型,即是大端字节序还是小端字节序,这里是0x01,代表是小端字节序

再接着代表文件的版本,固定位1,所以是0x01,到这里我们就将第一个分析e_ident[EI_NIDENT]的信息分析完了。

  • 接着我们分析struct余下的字段:

e_type代表的是OS ABI的类型,查看010Editor的信息,这里是0x03,对应的是GNU/Linux类型,也和readelf的信息对应上了

后面的字段也类似,一次对应即可。这样ELF头信息就能很好的解读出来。接下来要说明的是section的信息了

Section hader解读

readelf section header获取到的信息如上,一共有11个section,其中第一个section是空的,这个是ELF的定义如此,那么我们要怎么在010Editor中找到对应字节的位置呢?首先在ELF header中,有一个关键的信息,就是section header的便宜,相信在上一节内容,你已经知道了,对应readelf的信息就是 Start of section headers: 3756960 (bytes into file),没错,这里就是和文件头的偏移量:3756960,即十六进制的3953A0。那么接下来我们在010Editor中跳转到3953A0位置看看

《(原创)Odex文件二进制分析》

这里蓝色标注的内容就是一个section header描述的信息,section header在代码中的描述如下所示

第一个sh_name,这个需要特别说明一下,这个sh_name是一个Elf64_Word,实际是uint_32类型的,里面存储的是一个地址,指向
.shstrtab section中某个字串的开始地址。所以我们先看看.shstrtab section中存储的是什么内容吧,通过readelf中Section Header信息可以知道.shstrtab节的偏移地址位0x00395338,是的,这里直接读出来的地址就已经是16进制过的了。然后在010Editor中查看这个地址在存储的内容是什么呢?

《(原创)Odex文件二进制分析》

通过右边的字符串区可以看到一些可读信息,这里面存储的就是该odex文件中用到的section name。而在具体的section中,对应的sh_name的值就是.shstrtab section中的偏移量。

OK,因为博主也是最近才开始用010Editor查看并对照这代码来分析的,目前上面的信息暂时够用了,后续有要对各个section的内容做分析的时候,博主再补充了,或者各位看官有什么不懂得,可以提出来,后续博主再继续分析哈。

  1. guyuehu说道:

    大佬,可以加友链吗?

    1. jimmychen说道:

      emmm,这个没弄过唉,不知道咋操作

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注