dex 文件实践分析前篇---drizzleDumper知识储备

想写这系列的文章起源还是看到了linux内核之旅里的dex文件格式介绍,所以打算写一篇回顾笔记,回顾一下这块内容。

后续会通过项目https://github.com/DrizzleRisk/drizzleDumper 

分析一下dex的实践应用,尽管这种方式现在已经被淘汰了,但是还是值得我们回味!!!

dex文件格式

Leb128(Little-Endian Base 128)

LITTLE-ENDIAN(小字节序、低字节序),即低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。与之对应的是:BIG-ENDIAN(大字节序、高字节序)。

为了实现变长存储,节省空间,每个字节最高位作为后续byte是否有效的标志位,1表示还有后续字节,0表示结束,后面7bits是有效数据,所以一个整数最大要5个byte存储。

0 1010101

1010101是有效数据位

0 是标志位 0代表后续无效 1代表后续有效。

注意高位在左边

Uleb 128 格式

按照文章里,用624485 我们看一下这种格式

624485的

1)二进制:

100110 0001110 1100101

2)高位补齐7 bits的倍数:

这个二进制串20个字节,我们只需要补一个就i变成21个字节了

0100110 0001110 1100101

3)7字节进行分组

0100110 0001110 1100101

4)对二进制进行编码

注意我估计文章遵循的还是 最高位 1 是 有效数据,0是无效数据的规则

00100110 10001110 11100101

5)转成16进制

0x26        0x8E        0xE5

6) 小端排列

0xE5  0x8E        0x26

sleb128 格式

sleb128 格式和uleb 128 格式类似,正数的处理和uleb128 完全一致,负数在机器中通过补码标识,若某一byte 第7位和前面的高位都为1 时则停止.

还是用一个数字 -123456 来看这种数据格式。

我们先思考第一个问题,计算机是如何表示负数的,没错就是补码。

在计算机中,负数都是以补码的形式存放的。而负数的补码正是正数的补码的相反数,由于我们只知道如何计算正数的二进制,所以在求负数的二进制的时候,应该先求负数的相反数的二进制(即正数的二进制),然后再求正数的二进制的相反数。具体计算过程如下:先求负数所对应的相反数(即正数)的二进制,然后再取反,再加1,就得到了负数的二进制,这也是负数在计算机中的存储形式。

-123456 解析过程

1)123456 的二进制原码

1000 0000 0000 0001 1110 0010 0100 0000

2)反码

1111 1111 1111 1110 0001 1101 1011 1111

3)补码

1111 1111 1111 1110 0001 1101 1100 0000

4)用7bits 分组

1111 1111111 1111000 0111011 1000000

5)对二进制编码

1111 1111111 1111000 10111011 11000000

由于规则第7位和前面的高位都是1就要停止

所以最后的格式为:

01111000 10111011 11000000

6)转换成16进制数

0x7B 0xBB 0xC0

7)小端排序

0xC0 0XBB 0x7B

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值