PE文件結構詳解(DOS頭/NT頭/節表/導入表)使用010 Editor手動解析notepad++.exe的PE結構

一:DOS部分

DOS部分分為DOS MZ文件頭和DOS塊,其中DOS MZ頭實際是一個64位的IMAGE_DOS——HEADER結構體。

DOS MZ頭部結構體的內容如下,我們所需要關注的是前面兩個字節(e_magic)和后面四個字節(e_lfanew)

typedef struct _IMAGE_DOS_HEADER
{WORD   e_magic;       // DOS頭的標識  "MZ"  4Dh  5Ah(2個字節)      #define IMAGE_DOS_SIGNATURE  0x5A4DWORD   e_cblp;        // 文件最后一頁中的字節數WORD   e_cp;          // 文件中的全部頁數WORD   e_crlc;        // 重定位表中的指針數WORD   e_cparhdr;     // 頭部尺寸,以段落為單位WORD   e_minalloc;    // 所需的最小附加段  WORD   e_maxalloc;    // 所需的最大附加段  WORD   e_ss;          // 初始的SS值(相對偏移量)WORD   e_sp;          // 初始的SP值WORD   e_csum;        // 補碼校驗值WORD   e_ip;          // 初始的IP值   WORD   e_cs;          // 初始的CS值WORD   e_lfarlc;      // 重定位表的字節偏移量 WORD   e_ovno;        // 覆蓋號WORD   e_res[4];      // 保留字WORD   e_oemid;       // OEM 標識符(相對e_oeminfo) WORD   e_oeminfo;     // OEM 信息WORD   e_res2[10];    // 保留字// DosHeader + 0x3C 正好定位到e_lfanewLONG    e_lfanew;     // NT頭相對于文件起始地址的偏移, 4字節, 指示NT頭的位置
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

二、PE文件頭

PE文件頭可以分為三個部分,分別為PE標識、標準PE頭、擴展PE頭,結構體內容如下所示

typedef struct _IMAGE_NT_HEADERS {DWORD Signature; ``// PE標識--4字節IMAGE_FILE_HEADER FileHeader; ``// 標準PE頭--20字節IMAGE_OPTIONAL_HEADER32 OptionalHeader; ``// 擴展PE頭--224字節/240字節
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

現在我們詳細解釋一下標準PE頭,標準PE頭的結構體如下:

typedef struct _IMAGE_FILE_HEADER
{WORD Machine;                //PE文件運行的平臺,值為IMAGE_FILE_MACHINE_I386(0x14c)表示是x86處理器,//IMAGE_FILE_MACHINE_AMD64(0x8664)或IMAGE_FILE_MACHINE_IA64(0x200)表示是x64處理器。WORD NumberOfSections;       //文件中存在的節的個數,如果想在PE文件中增加或刪除節,必須變更此處的值DWORD TimeDateStamp;         //創建此文件時的時間戳DWORD PointerToSymbolTable;  //COFF符號表的文件偏移,對于映像文件來說,此值為0DWORD NumberOfSymbols;       //符號表中元素的數目,對于映像文件來說,此值為0WORD SizeOfOptionalHeader;   //可選頭的大小,32位下默認為00E0h,64位下默認為00F0hWORD Characteristics;        //文件屬性標志,exe一般是010fh,dll一般是210eh
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

現在我們得到:

那什么是PE文件屬性呢,現在我們知道PE文件屬性的十六進制值是00 22(倒序讀取),那么可以得到二進制是0001 0110

對應下面的表,也就是第1位、第二位和第四位對應數字為1得到的屬性值

對于擴展PE頭,大小有標準PE頭的SizeOfOptionalHeader決定,就是00F0

三、節表

每個節表的固定大小是40字節,節表不止一個,可能有多個,節表的數量是標準PE頭中的NumberOfSections屬性決定的,雖然節表有多個,但是每個節表中的結構是相同的。

根據上面的標準頭解析,可以看到是六個節表(00 06),每個節表大小是40字節,一共是240字節,如下圖

每個節表的最后四個字節是屬性,這里是60 00 00 20,可以得到二進制是0110 0000 0000 0000 0000 0000 0010 0000

那么就可以得到:

利用工具打開,可以發現是六個節表

以下是節表的基本結構

typedef struct _IMAGE_SECTION_HEADER {
0x00 BYTE Name[IMAGE_SIZEOF_SHORT_NAME];     //00 00 00 74 78 65 74 2E 8字節,節表的名字,一般情況下"\0"來結束,內容可以自己定義
union {  0x08 DWORD PhysicalAddress; 0x08 DWORD VirtualSize;                    
} Misc;                                      //00 01 80 6C   雙字,是該節在沒有對齊前的真是尺寸,內容可以不準確
0x0c DWORD VirtualAddress;                   //00 00 10 00   節區在內存中的偏移地址
0x10 DWORD SizeOfRawData;                    //00 01 82 00   節在文件中對齊后的尺寸
0x14 DWORD PointerToRawData;                 //00 00 04 00   節區在文件中的偏移
0x18 DWORD PointerToRelocations;             //00 00 00 00   在exe文件中無意義
0x1c DWORD PointerToLinenumbers;             //00 00 00 00   在exe文件中無意義
0x20 WORD NumberOfRelocations;               //00 00         在exe文件中無意義
0x22 WORD NumberOfLinenumbers;               //00 00         該節在行號表中的行號數
0x24 DWORD Characteristics;                  //60 00 00 20   節的屬性
};

?四、節數據

查看區段:

我們需要的是節區在文件中的偏移,就是在20字節之后的00000400,節區的大小是在16字節之后的,也就是0046FE00

?也就是00000400之后的數據:

以上就是最基本的PE文件結構了。

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

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

相關文章

Node JS 調用模型Xenova_all-MiniLM-L6-v2實戰

本篇通過將句子數組轉換為句子的向量表示,并通過平均池化和歸一化處理,生成適合機器學習或深度學習任務使用的特征向量為例,演示通過NodeJS 的方式調用Xenova/all-MiniLM-L6-v2 的過程。 關于 all-MiniLM-L6-v2 的介紹,可以參照上…

【C++學習篇】智能指針

目錄 1. 智能指針的使用場景分析 2. RAII和智能指針的設計思路 3. C標準庫智能指針的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循環引用問題 4.2 weak_ptr 1. 智能指針的使用場景分析 下?程序中我們可以看到,new了以后,我們也delete了&#xff0c…

IntelliJ IDEA集成MarsCode AI

IntelliJ IDEA集成MarsCode AI IDEA中安裝插件 安裝完畢之后登錄自己的賬號 點擊鏈接,注冊賬號 https://www.marscode.cn/events/s/i5DRGqqo/ 可以選擇不同的模型

日期格式與字符串不匹配bug

異常特征:java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String ### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.Str…

C++中的無鎖編程

引言 在當今多核處理器普及的時代,并發編程已成為高性能應用程序開發的關鍵技術。傳統的基于鎖的同步機制雖然使用簡單,但往往會帶來性能瓶頸和死鎖風險。無鎖編程(Lock-Free Programming)作為一種先進的并發編程范式&#xff0c…

FastGPT 引申:借鑒 FastGPT 基于MySQL + ES 實現知識庫(含表結構以及核心代碼)

文章目錄 FastGPT 引申:借鑒 FastGPT 基于MySQL ES 實現知識庫(含表結構以及核心代碼)一、整體思路二、存儲結構2.1 MySQL 表結構(1) knowledge_base_dataset(2) knowledge_base_data(3) knowledge_base_index(4) ai_kb_relation 2.2 Elasti…

Python學習(十四)pandas庫入門手冊

目錄 一、安裝與導入二、核心數據結構2.1 Series 類型(一維數組)2.2 DataFrame 類型(二維數組) 三、數據讀取與寫入3.1 讀取 CSV 和 Excel 文件3.2 寫入數據 四、數據清洗與處理4.1 處理缺失值4.2 數據篩選4.3 數據排序 五、數據分…

【Python 數據結構 4.單向鏈表】

目錄 一、單向鏈表的基本概念 1.單向鏈表的概念 2.單向鏈表的元素插入 元素插入的步驟 3.單向鏈表的元素刪除 元素刪除的步驟 4.單向鏈表的元素查找 元素查找的步驟 5.單向鏈表的元素索引 元素索引的步驟 6.單向鏈表的元素修改 元素修改的步驟 二、Python中的單向鏈表 ?編輯 三…

第1章:項目概述與環境搭建

第1章:項目概述與環境搭建 學習目標 了解YunChangAction靈感記錄應用的整體架構和功能掌握SwiftUI開發環境的配置方法創建項目基礎結構并理解文件組織方式實現應用的啟動屏幕和基本主題設置 理論知識講解 靈感記錄應用概述 靈感記錄應用是一種專門設計用來幫助…

2025.3.3總結

周一這天,我約了績效教練,主要想了解專業類績效的考核方式以及想知道如何拿到一個更好的績效。其他的崗位并不是很清楚,但是專業類的崗位,目前采取絕對考核,管理層和專家崗采取相對考核,有末尾淘汰。 通過…

FastGPT 源碼:基于 LLM 實現 Rerank (含Prompt)

文章目錄 基于 LLM 實現 Rerank函數定義預期輸出實現說明使用建議完整 Prompt 基于 LLM 實現 Rerank 下邊通過設計 Prompt 讓 LLM 實現重排序的功能。 函數定義 class LLMReranker:def __init__(self, llm_client):self.llm llm_clientdef rerank(self, query: str, docume…

LeetCode 1745.分割回文串 IV:動態規劃(用III或II能直接秒)

【LetMeFly】1745.分割回文串 IV:動態規劃(用III或II能直接秒) 力扣題目鏈接:https://leetcode.cn/problems/palindrome-partitioning-iv/ 給你一個字符串 s ,如果可以將它分割成三個 非空 回文子字符串,…

25年3月5日

1.思維導圖 2.不太會 #include "head.h" int main(int argc, const char *argv[]) {int fdopen("../xiaoxin.bmp","O_RDONLY");if(fd-1)printf("open error");//大小struct stat st;if(stat("…

全球首創!微軟發布醫療AI助手,終結手寫病歷時代

今天凌晨,微軟發布了醫療界首個用于臨床工作流程的AI助手Microsoft Dragon Copilot。 Dragon Copilot是基于語音文本的混合架構,能夠將醫生的語音或臨床口述內容實時轉換為文本。例如,醫生可以通過語音輸入患者的病歷信息、醫囑或診斷結果&a…

[自動駕駛-傳感器融合] 多激光雷達的外參標定

文章目錄 引言外參標定原理ICP匹配示例參考文獻 引言 多激光雷達系統通常用于自動駕駛或機器人,每個雷達的位置和姿態不同,需要將它們的數據統一到同一個坐標系下。多激光雷達外參標定的核心目標是通過計算不同雷達坐標系之間的剛性變換關系&#xff08…

Blazor-路由模板(下)

路由約束 類型約束 我們這里使用{id:int}限制路由&#xff0c;id為int類型&#xff0c;并且路由參數 id 對應的 Id 屬性也必須是 int 類型。我們試試能否正常訪問 page "/demoPage/{id:int}" <h3>demoPage</h3> <h2>路由參數Id&#xff1a;Id&l…

多線程-JUC源碼

簡介 JUC的核心是AQS&#xff0c;大部分鎖都是基于AQS擴展出來的&#xff0c;這里先結合可重入鎖和AQS&#xff0c;做一個講解&#xff0c;其它的鎖的實現方式也幾乎類似 ReentrantLock和AQS AQS的基本結構 AQS&#xff0c;AbstractQueuedSynchronizer&#xff0c;抽象隊列…

通過多線程獲取RV1126的AAC碼流

目錄 一RV1126多線程獲取音頻編碼AAC碼流的流程 1.1AI模塊的初始化并使能 1.2AENC模塊的初始化 ???????1.3綁定AI模塊和AENC模塊 ???????1.4多線程獲取每一幀AAC碼流 ???????1.5每個AAC碼流添加ADTSHeader頭部 ???????1.6寫入具體每一幀AAC的…

JVM常用概念之對象初始化的成本

在JVM常用概念之新對象實例化博客中我講到了對象的實例化&#xff0c;主要包含分配&#xff08;TLAB&#xff09;、系統初始化、用戶初始化&#xff0c;而我在JVM常用概念之線程本地分配緩沖區&#xff08;ThreadLocal Allocation Buffer&#xff0c;TLAB&#xff09;博客中也講…

java后端開發day27--常用API(二)正則表達式爬蟲

&#xff08;以下內容全部來自上述課程&#xff09; 1.正則表達式&#xff08;regex&#xff09; 可以校驗字符串是否滿足一定的規則&#xff0c;并用來校驗數據格式的合法性。 1.作用 校驗字符串是否滿足規則在一段文本中查找滿足要求的內容 2.內容定義 ps&#xff1a;一…