[PE結構分析] 5.IMAGE_OPTIONAL_HEADER

来源:http://www.cnblogs.com/night-ride-depart/archive/2016/08/14/5769946.html
-Advertisement-
Play Games

結構體源代碼如下: typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // +18h WORD Magic; // 標誌字, ROM 映像(0107h),普通可執行文件(010Bh) +1Ah BYTE MajorLinke... ...


結構體源代碼如下:

typedef struct _IMAGE_OPTIONAL_HEADER 
{
    //
    // Standard fields.  
    //
+18h    WORD    Magic;                   // 標誌字, ROM 映像(0107h),普通可執行文件(010Bh)
+1Ah    BYTE    MajorLinkerVersion;      // 鏈接程式的主版本號
+1Bh    BYTE    MinorLinkerVersion;      // 鏈接程式的次版本號
+1Ch    DWORD   SizeOfCode;              // 所有含代碼的節的總大小
+20h    DWORD   SizeOfInitializedData;   // 所有含已初始化數據的節的總大小
+24h    DWORD   SizeOfUninitializedData; // 所有含未初始化數據的節的大小
+28h    DWORD   AddressOfEntryPoint;     // 程式執行入口RVA ***(必須瞭解)***
+2Ch    DWORD   BaseOfCode;              // 代碼的區塊的起始RVA
+30h    DWORD   BaseOfData;              // 數據的區塊的起始RVA
    //
    // NT additional fields.    以下是屬於NT結構增加的領域。
    //
+34h    DWORD   ImageBase;               // 程式的首選裝載地址 ***(必須瞭解)***
+38h    DWORD   SectionAlignment;        // 記憶體中的區塊的對齊大小 ***(必須瞭解)***
+3Ch    DWORD   FileAlignment;           // 文件中的區塊的對齊大小 ***(必須瞭解)***
+40h    WORD    MajorOperatingSystemVersion;  // 要求操作系統最低版本號的主版本號
+42h    WORD    MinorOperatingSystemVersion;  // 要求操作系統最低版本號的副版本號
+44h    WORD    MajorImageVersion;       // 可運行於操作系統的主版本號
+46h    WORD    MinorImageVersion;       // 可運行於操作系統的次版本號
+48h    WORD    MajorSubsystemVersion;   // 要求最低子系統版本的主版本號
+4Ah    WORD    MinorSubsystemVersion;   // 要求最低子系統版本的次版本號
+4Ch    DWORD   Win32VersionValue;       // 莫須有欄位,不被病毒利用的話一般為0
+50h    DWORD   SizeOfImage;             // 映像裝入記憶體後的總尺寸
+54h    DWORD   SizeOfHeaders;           // 所有頭 + 區塊表的尺寸大小
+58h    DWORD   CheckSum;                // 映像的校檢和
+5Ch    WORD    Subsystem;               // 可執行文件期望的子系統 ***(必須瞭解)***
+5Eh    WORD    DllCharacteristics;      // DllMain()函數何時被調用,預設為 0
+60h    DWORD   SizeOfStackReserve;      // 初始化時的棧大小
+64h    DWORD   SizeOfStackCommit;       // 初始化時實際提交的棧大小
+68h    DWORD   SizeOfHeapReserve;       // 初始化時保留的堆大小
+6Ch    DWORD   SizeOfHeapCommit;        // 初始化時實際提交的堆大小
+70h    DWORD   LoaderFlags;             // 與調試有關,預設為 0 
+74h    DWORD   NumberOfRvaAndSizes;     // 下邊數據目錄的項數,這個欄位自Windows NT 發佈以來一直是16
+78h    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];   
// 數據目錄表 ***(必須瞭解,重點)*** winNT發佈到win10,IMAGE_NUMBEROF_DIRECTORY_ENTRIES一直都是16
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

AddressOfEntryPoint  ***(必須瞭解)***

程式開始執行的地址,這是一個RVA(相對虛擬地址)。對於exe文件,這裡是啟動代碼;對於dll文件,這裡是libMain()的地址。如果在一個可執行文件上附加了一段代碼並想讓這段代碼首先被執行,那麼只需要將這個入口地址指向附加的代碼就可以了。在脫殼時第一件事就是找入口點,指的就是這個值。

ImageBase  ***(必須瞭解)***

PE文件的優先裝入地址。也就是說,當文件被執行時,如果可能的話(當前地址沒有被使用),Windows優先將文件裝入到由ImageBase欄位指定的地址中。

對於EXE文件來說,由於每個文件總是使用獨立的虛擬地址空間,優先裝入地址不可能被**模塊占據,所以EXE總是能夠按照這個地址裝入

這也意味著EXE文件不再需要重定位信息。

對於DLL文件來說,由於多個DLL文件全部使用宿主EXE文件的地址空間,不能保證優先裝入地址沒有被**的DLL使用,所以DLL文件中必須包含重定位信息以防萬一。

因此,在前面介紹的 IMAGE_FILE_HEADER 結構的 Characteristics 欄位中,DLL 文件對應的 IMAGE_FILE_RELOCS_STRIPPED 位總是為0,而EXE文件的這個標誌位總是為1。

如果沒有指定的話,dll文件預設為0x10000000;exe文件預設為0x00400000,但是在Windows CE平臺上是0x00010000。此值必須是64K bytes的倍數!

SectionAlignment ***(必須瞭解)***

記憶體中區塊的對齊單位。區塊總是對齊到這個值的整數倍。此欄位必須大於或等於 FileAlignment ,預設值是系統頁面的大小。32位cpu通常值為 0x1000(十六進位),即4096,即4KB。64位cpu通常為 8kB
FileAlignment ***(必須瞭解)***

pe文件中區塊的對齊單位,以bytes(位元組)為單位。此值必須是2的次方倍,但是必須在512和64K區間之間(閉區間[521, 64*1024=65536]),如果SectionAlignment小於系統頁面的大小,那麼SectionAlignment的大小就和FileAlignment相同。pe文件中預設值為 521 位元組(0.5KB) 即 0x200(十六進位)。

Subsystem ***(必須瞭解)***

pe文件的用戶界面使用的子系統類型。定義如下:

#define IMAGE_SUBSYSTEM_UNKNOWN              0   // 未知子系統
#define IMAGE_SUBSYSTEM_NATIVE               1   // 不需要子系統(如驅動程式)
#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Windows GUI 子系統
#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Windows 控制檯子系統
#define IMAGE_SUBSYSTEM_OS2_CUI              5   // OS/2 控制檯子系統
#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // Posix 控制檯子系統
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // 鏡像是原生 Win9x 驅動程式
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Windows CE 圖形界面

例如,Visual Studio 2015中編譯程式時可以在圖形界面設置鏈接選項:

vs連接設置

更多請查看:

微軟官方文檔:https://msdn.microsoft.com/en-us/library/windows/desktop/ms680339(v=vs.85).aspx

DataDirectory ***(必須瞭解,重要)***

這個欄位可以說是最重要的欄位之一,它由16個相同的IMAGE_DATA_DIRECTORY結構組成。其結構如下:

typedef struct _IMAGE_DATA_DIRECTORY {
   DWORD   VirtualAddress; // 相對虛擬地址 
   DWORD   Size;           // 數據塊的大小
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

也就是定義了某塊的位置和大小。

雖然PE文件中的數據是按照裝入記憶體後的頁屬性歸類而被放在不同的節中的,但是這些處於各個節中的數據按照用途可以被分為導出表、導入表、資源、重定位表等數據塊,這16個IMAGE_DATA_DIRECTORY結構就是用來定義多種不同用途的數據塊的(如下表所示)。IMAGE_DATA_DIRECTORY結構的定義很簡單,它僅僅指出了某種數據塊的位置和長度。

#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // 導出表
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // 導入表
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // 資源表
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // 異常表(具體資料不詳)
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // 安全表(具體資料不詳)
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // 重定位表
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // 調試表
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage) 版權信息
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // 版權信息
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP (具體資料不詳)
#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory (線程位置存儲,具體資料不詳)
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory (不詳)
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers(不詳)
#define IMAGE_DIRECTORY_ENTRY_IAT            12   // 導入函數地址表
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors(不詳)
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor(不詳)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 一.commentView模塊搭建 commentView樣式分為兩種 1.xib搭建界面 1.1 因為評論的樣式大體上一樣,我們可以用同一個xib來處理 1.2 最熱評論 用一個label來搭建 1.3 下麵的內容不一樣 1.3.1 文本樣式的評論,下麵也用一個label搭建就可以了 label約 ...
  • 1、環境安裝 gcc、gcc-c++、make、cmake、svn yum install lzo-devel zlib-devel gcc gcc-c++ make cmake autoconf automake libtool ncurses-devel openssl-devel 2、jdk的... ...
  • 1. 操作系統環境、安裝包准備 宿主機:Max OSX 10.10.5 虛擬機:Parallel Desktop 10.1.1 虛擬機操作系統:CentOS 7 x86_64 DVD 1511.iso Oracle:linux.x64_11gR2_database_1of2.zip linux.x6 ...
  • 導入CSV格式的數據 (參見http://dev.mysql.com/doc/refman/5.6/en/load-data.html) 1.資料庫表(st_pptn_r) CREATE TABLE st_pptn_r ( STCD varchar(8) DEFAULT NULL, TM datet... ...
  • 摘要:與關係資料庫相比,每個NoSQL都有自己不同的適用場景,這裡帶大家盤點文檔資料庫、圖資料庫、鍵值數據存儲、列存儲資料庫與記憶體數據網路等領域的常用的NoSQL。 在幾年內,NoSQL資料庫一直以性能、可擴展性、靈活的模式和分析能力聚焦著人們的註意力。儘管關係型資料庫對於某些用例來說仍是一個不錯的... ...
  • 1.jar包安裝到MVN本地庫 mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0 -Dpackaging=jar -Dfile=ojdbc6.jar 2. oracle 12c... ...
  • R 是一門擁有統計分析及作圖功能的免費軟體,主要用於數學建模、統計計算、數據處理、可視化等方向。據 IEEE Spectrum發佈的2016年編程語言前10位排名來看,R語言由2015年排名第6位上升級2016年的第5位。目前在CRAN 上發佈的演算法包已經超過8000+多個。R體系涉及到高等數據、概 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...