x86汇编与逆向工程:软件破解与防护的艺术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3.3 处理二进制数

逆向工程通常涉及处理跨越多个字节的大二进制数。在处理这些数时,正确解释二进制字符串所代表的数需要理解零扩展(zero-extension)、位和字节的重要性,以及字节序(endianness)等概念。

1.零扩展与可读性

二进制数值通常会按照架构的字长进行零填充或零扩展。在32位架构中,这意味着要在数值左侧添加0,直到它的长度达到32位。例如,数值110012会被零填充为000000000000000000000000000110012

注意,为了提高可读性,这些位被分成四位一组或八位一组。这就像在十进制中每三位数之间添加逗号(比如1,000)一样。当数值被写成十六进制时,它们也被按字节分组,每个字节有两个字符。例如,数值4D216(等同于十进制的123410)可以被写作0416D216

2.位和字节的重要性

在二进制数中,位和字节可以根据它们在数字中的相对权重进行标记。图2.3展示了一些常见的标签。

图2.3 位和字节的重要性标签

在000000000000000000000000000110012中,最低有效位(Least Significant Bit,LSB)是最右边的位,其值为1。最高有效位(Most Significant Bit,MSB)是最左边的位,其值是0。当我们从二进制转换为十进制时,最高有效位会被乘以2的31次方,而最低有效位则会被乘以2的0次方。

除了最高有效位和最低有效位,还有最高有效字节和最低有效字节的概念。在000000000000000000000000000110012中,最低有效字节值为000110012,而最高有效字节值为000000002

位和字节也可以根据其相对于值两端的接近程度来标定。例如,邻近最低有效位(LSB)的位和字节被称为低阶位或低阶字节,而靠近最高有效位(MSB)的位和字节是高阶位或低阶字节。

3.字节序

在计算机内存中,数据是以字节的形式储存的。多数数据类型需要占用多个字节,例如,整型(int)就是32位或4字节。

字节序描述了这些字节在内存中的存储顺序。在小端序(little-endian)系统中,最低有效字节先被存储(在最低地址处)。在大端序(big-endian)系统中,最高有效字节先被存储(在最低地址处)。

例如,我们需要理解数值133710。这个数值在二进制中表示为00000000000000000000 0101 0011 10012,在十六进制中表示为0x00000539。图2.4展示了这些数值是如何存储在内存中的。

图2.4 字节序

无论系统的字节序如何,与变量相关的地址都是使用的最低地址或基地址。在小端序和大端序系统中,这在本例中都是地址1828。

定义

在小端序系统中,最低有效字节位于最低地址。在大端序系统中,最高有效字节位于最低地址。

本书主要研究的是x86架构,它是小端序系统。因此,一块数据的最低有效字节将位于基地址偏移0处。这对人类来说看起来是“反向”的,因为我们按照大端序进行阅读和写作。

提示:x86是一个小端序架构,所以最低地址包含最低有效位。