- x86匯編與逆向工程:軟件破解與防護的藝術
- (美)斯蒂芬妮·多馬斯 (美)克里斯托弗·多馬斯
- 983字
- 2025-02-10 16:05:43
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是一個小端序架構,所以最低地址包含最低有效位。
- 精通COBOL:大型機商業編程技術詳解(修訂版)
- 大前端三劍客:Vue+React+Flutter
- iOS App界面設計創意與實踐
- 從零基礎到精通Flutter開發
- Knative最佳實踐
- Cadence系統級封裝設計:Allegro SiP/APD設計指南
- BERT基礎教程:Transformer大模型實戰
- 軟件秘笈:設計模式那點事
- Verilog HDL數字系統設計及實踐
- Unity AR/VR開發:從新手到專家
- Unity 2017經典游戲開發教程:算法分析與實現
- 深入淺出數據結構與算法(微課視頻版)
- 大規模組織DevOps實踐(第2版)
- 現代軟件工程
- 構建跨平臺APP:jQuery Mobile移動應用實戰(第2版) (跨平臺移動開發叢書)