[置顶] 第4章 Android dex文件格式 第二节

第4章 dex文件格式 第二节

 

1、 环境配置

Ubuntu 15.10 系统 IP:192.168.153.130

理解dex文件格式

 

1、 查看andriod源码下的Dalvik/docs目录提供了一份dex-format.html文档,里面详细介绍了dex文件格式和数据结构。

[置顶] 第4章 Android dex文件格式 第二节_第1张图片

以上从byte到ulong很好理解表示1~8字节的无符号数,而sleb128、uleb128、

uleb128p1则是dex文件中特有的LEB128数据类型。其中每个LEB128由1~5个字节组成,所有的字节组合在一起表示一个32位的数据,看以下图:

[置顶] 第4章 Android dex文件格式 第二节_第2张图片

每个字节只有7位为有效位,如果第1个字节的最高为1,表示LEB128需要使用到第2字节,如果第2个字节的最高位为1,表示会使用到第3个字节,以此类推,直到最后的字节最高位为0,当然,LEB128最多只会使用5个字节,如果读取5个字节后下一个字节最高位仍为1,则表示dex文件无效,Dalvik虚拟机在验证dex时会失败返回。

可以查看andriod系统源码dalvik\libdex\leb128.h文件中可以找到LEB128的实现,读取无符号LEB128.

注意:(就是4个字节的数字被压缩为3个字节表示)

编码:

1)      例子将622284先将转为2进制表示

2)      2进制的表示的位(bit)扩展为能被7整除(不足的加0)

3)      再以7(bit)为一组进行分组

4)      把第1组最高位加0扩展为8(bit),而其余的都加1扩展为8(bit)

5)      将结果表示为16进制

 

解码:

1)      每次读取一个字节8(bit),判断其最高位是否为1

2)      1说明好有其他字节,0说明是最后一个字节解码结束

3)      然后提取出低7(bit),处理完所有的字节即可得到原来保存的值

 

你可能感兴趣的:([置顶] 第4章 Android dex文件格式 第二节)