官术网_书友最值得收藏!

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是一個小端序架構,所以最低地址包含最低有效位。

主站蜘蛛池模板: 正蓝旗| 霍林郭勒市| 高尔夫| 阿瓦提县| 鹤山市| 贞丰县| 青铜峡市| 孙吴县| 菏泽市| 太和县| 南宁市| 察雅县| 察雅县| 台山市| 永康市| 云霄县| 霍山县| 内丘县| 科技| 和政县| 科技| 祁阳县| 扶沟县| 高密市| 连平县| 翼城县| 昭苏县| 平邑县| 隆尧县| 河源市| 塔城市| 姜堰市| 呈贡县| 宣化县| 三亚市| 民丰县| 宿州市| 大新县| 明光市| 固阳县| 亳州市|