[逆向工程]如何理解小端序?逆向工程中的字節序陷阱與實戰解析

[逆向工程]如何理解小端序?逆向工程中的字節序陷阱與實戰解析

關鍵詞:逆向工程、小端序、字節序、二進制分析、數據解析

引言:為什么字節序是逆向工程師的必修課?

在逆向工程中,分析二進制數據是最基礎的任務之一。但當你嘗試解析一個整數、浮點數或結構體時,可能會遇到一個“反直覺”的現象:

  • 文件偏移 0x00 處的字節是 78 56 34 12,實際表示的整數值卻是 0x12345678
  • 網絡協議數據包中提取的 0xA1B2,實際含義可能是 0xB2A1

這一切的根源在于 字節序(Endianness),而小端序(Little-Endian)作為現代計算機的主流存儲方式,是逆向工程中必須深刻理解的概念。本文將從原理到實戰,詳解小端序在逆向工程中的關鍵作用。

一、字節序基礎:大端序 vs 小端序

1.1 什么是字節序?

字節序定義了一個多字節數據(如 int32, float)在內存或二進制文件中的存儲順序:

  • 大端序(Big-Endian):高位字節存儲在低地址。

    數值 0x12345678 存儲為:0x12 0x34 0x56 0x78  
    
  • 小端序(Little-Endian):低位字節存儲在低地址。

    數值 0x12345678 存儲為:0x78 0x56 0x34 0x12  
    
1.2 常見場景
  • 小端序:x86/x64、ARM(可配置)、Windows/Linux 系統。
  • 大端序:網絡協議(如TCP/IP頭部)、某些嵌入式設備(如PowerPC)。
1.3 小端序演示
1.示例代碼
#include <stdio.h>
#include <stdint.h> // 包含標準整數類型定義
int main() {// 演示小端序uint32_t num = 0x12345678;      // 32位整數unsigned char *ptr = (unsigned char *)&num;printf("Number in memory (Little Endian):\n");for (int j = 0; j < sizeof(num); j++) {printf("%02X ", ptr[j]);}printf("\n");return 0;
}

這段代碼會按照內存中的存儲順序依次輸出 num 的每個字節。在小端序(Little Endian)系統中,低地址存儲低字節,高地址存儲高字節。因此,代碼會從低地址到高地址依次輸出每個字節的內容。

2.詳細說明
  1. 變量定義
    • uint32_t num = 0x12345678;:定義一個32位無符號整數 num,其值為 0x12345678
    • unsigned char *ptr = (unsigned char *)#:將 num 的地址轉換為 unsigned char 類型的指針 ptr,以便逐字節訪問 num 的內容。
  2. 循環輸出
    • for (int j = 0; j < sizeof(num); j++):循環遍歷 num 的每個字節。
    • printf("%02X ", ptr[j]);:以16進制格式輸出每個字節的內容,%02X 確保輸出為兩位16進制數,不足兩位時前面補0。
3.輸出示例

假設 num 的值為 0x12345678,在小端序系統(如 Windows)中,內存中的存儲順序為:

  • 低地址:78
  • 次低地址:56
  • 次高地址:34
  • 高地址:12

因此,輸出將為:

Number in memory (Little Endian):
78 56 34 12
4.順序說明
  • 小端序:低地址存儲低字節,高地址存儲高字節。
  • 輸出順序:代碼從低地址到高地址依次輸出每個字節的內容,因此輸出順序與內存中的存儲順序一致。
5.輸出驗證

在這里插入圖片描述

6.當編譯為可執行程序時IDA查看變量值存儲方式

uint32_t num = 0x12345678;

在這里插入圖片描述

查找uint32_t num = 0x12345678;

在這里插入圖片描述

uint32_t num = 0x12345678變量存儲值為小端序:78 56 34 12

在這里插入圖片描述

二、逆向工程中的小端序實戰技巧

2.1 識別小端序的二進制數據

在逆向工程中,遇到以下特征時需警惕小端序:

  • 文件格式:PE文件(Windows可執行文件)、ELF文件(Linux可執行文件)的頭部字段通常是小端序。
  • 內存數據:調試器(如x64dbg、GDB)中查看內存時,默認按小端序顯示。

示例:解析PE文件的 IMAGE_NT_HEADERS 結構(Windows逆向必知):

typedef struct _IMAGE_NT_HEADERS {DWORD Signature; // 小端序存儲,例如 "PE\0\0" 顯示為 0x00004550// 其他字段...
} IMAGE_NT_HEADERS;
2.2 手動解析小端序數據

以Python為例,如何將字節序列轉換為小端序整數:

# 從二進制文件讀取4字節:b'\x78\x56\x34\x12'
bytes_data = b'\x78\x56\x34\x12'
value = int.from_bytes(bytes_data, byteorder='little')  # 輸出 0x12345678
2.3 逆向工具中的小端序支持
  • IDA Pro:按小端序解析數據的快捷鍵(默認已適配)。
  • Hex Editor:手動標記數據區域為小端序格式(如010 Editor的模板功能)。

三、小端序的陷阱與調試技巧

3.1 常見錯誤場景
  • 誤判字節序:將小端序數據當作大端序解析,導致數值錯誤(例如 0x78563412 被誤讀為 0x78563412 而非 0x12345678)。
  • 跨平臺數據解析:從網絡或嵌入式設備接收的數據可能混合大小端序。
3.2 調試技巧
  • 動態驗證:在調試器中修改內存數據,觀察數值變化。
  • 交叉對比:用腳本(如Python)和工具(如WinHex)雙重驗證解析結果。

案例:分析一個加密算法的密鑰(假設密鑰為4字節小端序):

原始字節:0xDE 0xAD 0xBE 0xEF  
小端序值:0xEFBEADDE  # 正確密鑰  
大端序誤讀:0xDEADBEEF # 錯誤密鑰!

四、進階:處理混合字節序的場景

4.1 協議逆向中的字節序切換

某些協議(如網絡協議)可能混合使用大小端序:

  • TCP/IP頭部:端口號、IP地址為大端序。
  • 自定義協議體:可能包含小端序數據。
4.2 自動化處理方案

編寫逆向腳本時,動態切換字節序:

def parse_data(bytes_data, is_little_endian):return int.from_bytes(bytes_data, byteorder='little' if is_little_endian else 'big')

五、總結與學習資源

5.1 核心要點
  • 小端序是x86/x64架構的主流存儲方式,逆向工程必須優先考慮。
  • 工具和腳本需明確指定字節序,避免誤解析。
5.2 延伸學習
  • 書籍推薦:《逆向工程權威指南》、《加密與解密》。
  • 實戰練習:分析PE文件結構、破解CTF逆向題(如CTFtime)。

通過本文,讀者可以快速掌握小端序的核心原理,并學會在逆向工程中規避字節序陷阱。如果遇到問題,歡迎在評論區交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77787.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目三 - 任務2:創建筆記本電腦類(一爹多叔)

在本次實戰中&#xff0c;我們通過Java的單根繼承和多接口實現特性&#xff0c;設計了一個筆記本電腦類。首先創建了Computer抽象類&#xff0c;提供計算的抽象方法&#xff0c;模擬電腦的基本功能。接著定義了NetCard和USB兩個接口&#xff0c;分別包含連接網絡和USB設備的抽象…

ElasticSearch深入解析(六):集群核心配置

1.開發模式和生產模式 Elasticsearch默認運行在開發模式下&#xff0c;此模式允許節點在配置存在錯誤時照常啟動&#xff0c;僅將警告信息寫入日志文件。而生產模式則更為嚴格&#xff0c;一旦檢測到配置錯誤&#xff0c;節點將無法啟動&#xff0c;這是一種保障系統穩定性的安…

【Prometheus-MySQL Exporter安裝配置指南,開機自啟】

目錄 1. 創建 MySQL 監控用戶2. 配置 MySQL 認證文件3. 安裝 mysqld_exporter4. 配置 Systemd 服務5. 啟動并驗證服務6. 修改Prometheus配置常見錯誤排查錯誤現象排查步驟 6. 驗證監控數據關鍵注意事項 7. Grafana看板 1. 創建 MySQL 監控用戶 mysql -uroot -p123456 # 登錄M…

redis未授權訪問漏洞學習

一、Redis常見用途 1. Redis介紹 全稱與起源: Redis全稱Remote Dictionary Service(遠程字典服務)&#xff0c;最初由antirez在2009年開發&#xff0c;用于解決網站訪問記錄統計的性能問題。發展歷程: 從最初僅支持列表功能的內存數據庫&#xff0c;經過十余年發展已支持多種…

4.27搭建用戶界面

更新 router下面的index.js添加新的children 先區分一下views文件夾下的不同vue文件&#xff1a; Home.vue是繪制home頁面的所有的表格。 Main.vue是架構頭部和左側目錄的框架的。 研究一下這個routes對象&#xff0c;就可以發現重定向redirect的奧妙所在&#xff0c;我們先把…

【MySQL】(8) 聯合查詢

一、聯合查詢的作用 由于范式的規則&#xff0c;數據分到多個表中&#xff0c;想要查詢完整的信息&#xff0c;就需要聯合查詢多張表。比如查詢學生的學生信息和所在班級的信息&#xff0c;就需要聯合查詢學生表和班級表。 二、聯合查詢過程 案例&#xff1a;查詢學生姓名為孫…

圖漾官網Sample_V1版本C++語言完整參考例子---單相機版本

文章目錄 1.參考例子 主要梳理了圖漾官網Sample_V1版本的例子 1.參考例子 主要增加了從storage區域讀取相機參數的設置&#xff0c;使用圖漾PercipioViewer軟件&#xff0c;如何將相機參數保存到srorage區&#xff0c;可參考鏈接&#xff1a;保存相機參數操作 保存參數設置 注…

關于本地端口啟動問題

如何啟動一個本地端口 1. Node.js (使用Express框架) 使用node.js的方法 注意&#xff1a;下列bash命令最好在管理員權限運行的cmd窗口中進行&#xff0c;否則可能會有權限錯誤 首先&#xff0c;確保您已經安裝了Node.js和npm。然后&#xff0c;創建一個新的Node.js項目并安…

產銷協同的作用是什么?又如何對各部門發揮作用?

目錄 一、產銷協同的對象有哪些&#xff1f; 1. 客戶需求 2. 市場趨勢 3. 供應鏈伙伴 4. 企業戰略目標 二、產銷協同的作用是什么&#xff1f; 1. 提高客戶滿意度 2. 降低企業成本 3. 增強市場競爭力 4. 優化資源配置 三、產銷協同對各部門怎么發揮作用&#xff1f;…

React Router v7 從入門到精通指南

一、設計思想與核心原理 1. 設計哲學 組件即路由&#xff1a;路由以 <Route> 組件形式聲明&#xff0c;與 React 組件樹深度集成聲明式導航&#xff1a;通過 <Link> 和 useNavigate 實現無刷新路由跳轉動態匹配機制&#xff1a;路徑參數、通配符、優先級匹配規則…

Python爬蟲實戰:獲取網yi新聞網財經信息并做數據分析,以供選股做參考

一、引言 在財經領域,股市信息對投資者意義重大。網yi新聞作為知名新聞資訊平臺,其股市板塊蘊含豐富的最新股市熱點信息。然而,依靠傳統人工方式從海量網頁數據中獲取并分析這些信息,效率低下且難以全面覆蓋。因此,利用爬蟲技術自動化抓取相關信息,并結合數據分析和機器…

Spring Boot Actuator - 應用監控與管理

一、 Spring Boot Actuator 概述 Spring Boot Actuator是Spring Boot 提供的生產級監控與管理工具集&#xff0c;用于實時監控和運維管理應用。Actuator 通過HTTP 端點&#xff08;或 JMX 端點&#xff09;暴露應用的健康狀態、性能指標、日志信息、環境配置等關鍵數據&#x…

不同類型插槽的聲明方法和對應的調用方式

在 Vue 3 中&#xff0c;slot 用于讓組件的使用者可以向組件內部插入自定義內容。Vue 3 提供了多種聲明和使用插槽的方式&#xff0c;下面為你詳細介紹不同類型插槽的聲明方法和對應的調用方式。 1. 匿名插槽 聲明方法 在組件模板中直接使用 標簽來定義匿名插槽&#xff0c;它可…

DeepSeek 聯手 Word,開啟辦公開掛模式

目錄 一、DeepSeek 與 Word 結合的神奇之處二、前期準備&#xff0c;萬事俱備2.1 了解 DeepSeek2.2 確認軟件版本2.3 賬號與密鑰獲取 三、接入方法全解析3.1 OfficeAI 插件接入3.1.1 下載與安裝插件3.1.2 配置 API 密鑰 3.2 VBA 宏接入3.2.1 啟用開發者工具3.2.2 調整信任設置3…

云鑰科技紅外短波工業相機

云鑰科技的紅外短波相機是一款基于短波紅外&#xff08;SWIR&#xff0c;波長范圍約1-3微米&#xff09;技術的成像設備&#xff0c;專為高精度檢測、全天候成像及特殊場景應用設計。以下從核心技術、性能參數、應用場景及產品優勢等方面進行詳細介紹&#xff1a; ??一、核心…

得物 小程序 6宮格 分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向過程 部分python代碼 if result …

第十六屆藍橋杯 2025 C/C++B組 第二輪省賽 全部題解(未完結)

目錄 前言&#xff1a; 試題A&#xff1a;密密擺放 試題B&#xff1a;脈沖強度之和 試題C&#xff1a;25之和 試題D&#xff1a;旗幟 試題H&#xff1a;破解信息 前言&#xff1a; 這是我后續刷到的第二輪省賽的題目&#xff0c;我自己也做了一下&#xff0c;和第一輪省賽…

conda和bash主環境的清理

好的&#xff01;要管理和清理 Conda&#xff08;或 Bash&#xff09;安裝的包&#xff0c;可以按照以下步驟進行&#xff0c;避免冗余依賴&#xff0c;節省磁盤空間。 &#x1f4cc; 1. 查看已安裝的包 先列出當前環境的所有安裝包&#xff0c;找出哪些可能需要清理&#xff…

【Linux】服務自啟動設置的方式

關于服務自啟動設置的方式,本文將介紹兩種方法。分別是systemd服務單元文件的配置和起容器的方式。 目錄 1 systemd服務單元文件的配置 [Unit] 部分 [Service] 部分 [Install] 部分 2 docker 1 systemd

面試篇 - LoRA(Low-Rank Adaptation) 原理

1. 問題背景 大模型微調的挑戰&#xff1a; 預訓練模型&#xff08;如GPT-3、LLaMA&#xff09;參數量巨大&#xff08;數十億至萬億級&#xff09;&#xff0c;直接微調所有參數&#xff1a; 計算開銷大&#xff1a;需更新全部權重&#xff0c;GPU顯存不足。 存儲冗余&#…