正文
output
=
HelloWorld
.
dex
HelloWorld
.
class
就会出现 HelloWorld.dex 文件了。这时,我们需要下载一个十六进位文本编辑器,因为用它可以解析二进制文件,我们用它打开dex文件就会全部以十六进制的数进行展现了。这里推荐010Editor(收费软件,可以免费试用30天):
http://www.sweetscape.com/download/010editor
下载完成之后,我们可以用它打开dex文件了,打开之后,你的界面应该是这样的:
一下子看到这些东西,是不是立马懵逼了,正常,我刚开始看的时候也是,这什么玩意儿啊!其实,这就是二进制流文件中的内容,010Editor 把它转化成了16进制的内容,以方便我们阅读的。
不要慌,下面我跟你解释,这些东西我们虽然看了懵逼,但是 Dalvik虚拟机 不会,因为它就是解析这些东西的,这些东西虽然看起来头大,但是它是有自己的格式标准的。dex文件的结构如下图所示:
这就是dex的文件格式了,下面我们从最上面的 Header 说起,Header 中存储了什么内容呢?下面我们还得来一张图:
先看下就行,不用着急,下面我们一步一步来,首先点击你的010Editor的这里:
对,就是箭头指的那里,点击之后,你会发现上面的有一片区域成了选中的颜色,这部分里面存储的就是 Header 中的数据了,下面我们根据 Header 的数据图以此来进行分析。
首先,我们看到 DexHeader 中每个数据前面有个
u1
或者
u4
,这个是什么意思呢?它们其实就是代表 1个 或者 4个 字节的无符号数。下面我们依次根据 Header 中的数据段进行解释。
1.
从第一个看起,
magic[8]
;它代表dex中的文件标识,一般被称为
魔数
。是用来识别dex这种文件的,它可以判断当前的dex文件是否有效,可以看到它用了8个1字节的无符号数来表示,我们在010Editor中可以看到也就是“
64 65 78 0A 30 33 35 00
”这8个字节,这些字节都是用16进制表示的,用16进制表示的话,两个数代表一个字节(一个字节等于8位,一个16进制的数能表示4位)。这8个字节用ASCII码表转化一下可以转化为:
dex
.
035
(其中,'
.
' 不是转化来的)。目前,dex的魔数固定为
dex.035
。
2.
第二个是,
checksum
; 它是dex文件的校验和,通过它可以判断dex文件是否被损坏或者被篡改。它占用4个字节,也就是“
5D 9D F9 59
”。这里提醒一下,在010Editor中,其实可以分别识别我们在DexHeader中看到的这些字段的,你可以点一下这里:
你可以看到这个 header列表 展开了,其实我们分析下来就和它这个结构是一样的,你可以先看下,我们现在分析到了 checksum 中了,你可以看到后面对应的值是“59 F9 9D 5D”。咦?这好像和上面的字节不是一一对应的啊。对的,你可以发现它是反着写的。这是由于dex文件中采用的是小字节序的编码方式,也就是低位上存储的就是低字节内容,所以它们应该要反一下。
3.
第三个到了
signature[kSHA1DigestLen]
了,signature 字段用于检验dex文件,其实就是把整个dex文件用SHA-1签名得到的一个值。这里占用20个字节,你可以自己点010Editor看一看。
4.
第四个
fileSize
;表示整个文件的大小,占用4个字节。
5.
第五个
headerSize
;表示 DexHeader 头结构的大小,占用4个字节。这里可以看到它一共占用了112个字节,112对应的16进制数为70h,你可以选中头文件看看010Editor是不是真的占用了这么多:
6.
第6个是
endianTag
;代表 字节序标记,用于指定dex运行环境的cpu,预设值为0x12345678,对应在101Editor中为“78 56 34 12”(小字节序)。
7.