[PE結構分析] 6.IMAGE_SECTION_HEADER

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

IMAGE_SECTION_HEADER 的源代碼如下: 每個區塊表長度占40個位元組。 * 表示需要註意的欄位,最有用的是 SizeOfRawData 、 PointerToRawData 和Characteristics 欄位。 Name * 此欄位時區塊名。(一句話:名字而已,沒什麼用) 要求: ...


IMAGE_SECTION_HEADER 的源代碼如下:

typedef struct _IMAGE_SECTION_HEADER 
{
    BYTE Name[IMAGE_SIZEOF_SHORT_NAME];   // 節表名稱,如“.text” 
    //IMAGE_SIZEOF_SHORT_NAME=8
    union
    {
        DWORD PhysicalAddress; // 在文件中的物理地址
DWORD VirtualSize;     // 真實長度,這兩個值是一個聯合結構,可以使用其中的任何一個,一般是取後一個
} Misc;
    DWORD VirtualAddress;          // 節區的 RVA 地址
DWORD SizeOfRawData;           // 在文件中對齊後的尺寸
DWORD PointerToRawData;        // 在文件中的偏移量
DWORD PointerToRelocations;    // 在OBJ文件中使用,重定位的偏移
DWORD PointerToLinenumbers;    // 行號表的偏移(供調試使用地)
WORD NumberOfRelocations;      // 在OBJ文件中使用,重定位項數目
WORD NumberOfLinenumbers;      // 行號表中行號的數目
DWORD Characteristics;         // 節屬性如可讀,可寫,可執行等
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

每個區塊表長度占40個位元組。

* 表示需要註意的欄位,最有用的是 SizeOfRawData 、 PointerToRawData 和Characteristics 欄位。

Name *

此欄位時區塊名。(一句話:名字而已,沒什麼用

要求:

1. 占8個位元組的utf8字元串,如果區塊名超過 8 個位元組,則沒有最後的終止標誌“NULL”。

2. 每個區塊的名稱都是唯一的,不能有同名的兩個區塊。

3. 另外,如果名字過長,可以那麼使用斜杠(/)加上ASCII字元表示一個10進位地址,這個地址表示真正的區塊名在在字元串表中的地址。

含義:但事實上節的名稱不代表任何含義,僅僅是為了便查看方便(所以將包含代碼的區塊命名為“.Data” 或者說將包含數據的區塊命名為“.Code” 都是合法的。)。當我們要從PE 文件中讀取需要的區塊時候,不能以區塊的名稱作為定位的標準和依據。正確的做法是按照 IMAGE_OPTIONAL_HEADER32 結構中的數據目錄欄位結合進行定位。

其他說明:多數區塊名都習慣性以一個“.”作為開頭(例如:.text),這個“.” 不是必須的。並且前邊帶有一個“$” 的區塊名字會從連接器那裡得到特殊的待遇,前邊帶有“$” 的相同名字的區塊在載入時候將會被合併,在合併之後的區塊中,他們是按照“$” 後邊的字元的字母順序進行合併的。

Misc *

共用體:

PhysicalAddress 在文件中的地址。
Virtual Size 此節在讀取到記憶體中的總大小,單位是位元組。如果此值大於 SizeOfRawData 成員的話,此節將被0填充。此值僅當可執行鏡像且object文件必須被設置為0時有效。

 

Virtual Address *

該區塊裝載到記憶體中的RVA 地址。這個地址是按照記憶體頁來對齊的,因此它的數值總是 SectionAlignment 的值的整數倍。

在Microsoft 工具中,第一個快的預設 RVA 總為1000h。在OBJ 中,該欄位沒有意義地,並被設為0。

SizeOfRawData ***

該區塊在磁碟中所占的大小(單位是位元組),必須是IMAGE_OPTIONAL_HEADERFileAlignment成員的整數倍。如果此值小於Virtual Size,那麼剩下的位元組以0填充。如果此節僅包含未初始化的數據,那麼成員為0。

PointerToRawData ***

該區塊在磁碟中的偏移。這個數值是從文件頭開始算起的偏移量哦。

PointerToRelocations

這哥們在EXE文件中沒有意義,在OBJ 文件中,表示本區塊重定位信息的偏移值。(在OBJ 文件中如果不是零,它會指向一個IMAGE_RELOCATION 結構的數組)

PointerToLinenumbers

行號表在文件中的偏移值,文件的調試信息,於我們沒用,雞肋。

NumberOfRelocations

這哥們在EXE文件中也沒有意義,在OBJ 文件中,是本區塊在重定位表中的重定位數目來著。

NumberOfLinenumbers

該區塊在行號表中的行號數目,雞肋。

Characteristics ***

該區塊的屬性。該欄位是按位來指出區塊的屬性(如代碼/數據/可讀/可寫等)的標誌。

在 winnt.h 中定義如下:

//
// Section characteristics.
//
//      IMAGE_SCN_TYPE_REG                   0x00000000  // Reserved.
//      IMAGE_SCN_TYPE_DSECT                 0x00000001  // Reserved.
//      IMAGE_SCN_TYPE_NOLOAD                0x00000002  // Reserved.
//      IMAGE_SCN_TYPE_GROUP                 0x00000004  // Reserved.
#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  // Reserved.
//      IMAGE_SCN_TYPE_COPY                  0x00000010  // Reserved.

#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.

#define IMAGE_SCN_LNK_OTHER                  0x00000100  // Reserved.
#define IMAGE_SCN_LNK_INFO                   0x00000200  // Section contains comments or some other type of information.
//      IMAGE_SCN_TYPE_OVER                  0x00000400  // Reserved.
#define IMAGE_SCN_LNK_REMOVE                 0x00000800  // Section contents will not become part of image.
#define IMAGE_SCN_LNK_COMDAT                 0x00001000  // Section contents comdat.
//                                           0x00002000  // Reserved.
//      IMAGE_SCN_MEM_PROTECTED - Obsolete   0x00004000
#define IMAGE_SCN_NO_DEFER_SPEC_EXC          0x00004000  // Reset speculative exceptions handling bits in the TLB entries for this section.
#define IMAGE_SCN_GPREL                      0x00008000  // Section content can be accessed relative to GP
#define IMAGE_SCN_MEM_FARDATA                0x00008000
//      IMAGE_SCN_MEM_SYSHEAP  - Obsolete    0x00010000
#define IMAGE_SCN_MEM_PURGEABLE              0x00020000
#define IMAGE_SCN_MEM_16BIT                  0x00020000
#define IMAGE_SCN_MEM_LOCKED                 0x00040000
#define IMAGE_SCN_MEM_PRELOAD                0x00080000

#define IMAGE_SCN_ALIGN_1BYTES               0x00100000  //
#define IMAGE_SCN_ALIGN_2BYTES               0x00200000  //
#define IMAGE_SCN_ALIGN_4BYTES               0x00300000  //
#define IMAGE_SCN_ALIGN_8BYTES               0x00400000  //
#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  // Default alignment if no others are specified.
#define IMAGE_SCN_ALIGN_32BYTES              0x00600000  //
#define IMAGE_SCN_ALIGN_64BYTES              0x00700000  //
#define IMAGE_SCN_ALIGN_128BYTES             0x00800000  //
#define IMAGE_SCN_ALIGN_256BYTES             0x00900000  //
#define IMAGE_SCN_ALIGN_512BYTES             0x00A00000  //
#define IMAGE_SCN_ALIGN_1024BYTES            0x00B00000  //
#define IMAGE_SCN_ALIGN_2048BYTES            0x00C00000  //
#define IMAGE_SCN_ALIGN_4096BYTES            0x00D00000  //
#define IMAGE_SCN_ALIGN_8192BYTES            0x00E00000  //
// Unused                                    0x00F00000
#define IMAGE_SCN_ALIGN_MASK                 0x00F00000

#define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  // Section contains extended relocations.
#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.
#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.
#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.
#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.
#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.

//
// TLS Characteristic Flags
//
#define IMAGE_SCN_SCALE_INDEX                0x00000001  // Tls index is scaled

常用的值的翻譯:

數值

含義

IMAGE_SCN_CNT_CODE
0x00000020

The section contains executable code.

包含代碼,常與 0x10000000一起設置。

IMAGE_SCN_CNT_INITIALIZED_DATA
0x00000040

The section contains initialized data.

該區塊包含以初始化的數據。

IMAGE_SCN_CNT_UNINITIALIZED_DATA
0x00000080

The section contains uninitialized data.

該區塊包含未初始化的數據。

IMAGE_SCN_MEM_DISCARDABLE
0x02000000

The section can be discarded as needed.
該區塊可被丟棄,因為當它一旦被裝入後,
進程就不在需要它了,典型的如重定位區塊。

IMAGE_SCN_MEM_SHARED
0x10000000

The section can be shared in memory.
該區塊為共用區塊。

IMAGE_SCN_MEM_EXECUTE
0x20000000

The section can be executed as code.
該區塊可以執行。通常當0x00000020被設置
時候,該標誌也被設置。

IMAGE_SCN_MEM_READ
0x40000000

The section can be read.
該區塊可讀,可執行文件中的區塊總是設置該
標誌。

IMAGE_SCN_MEM_WRITE
0x80000000

The section can be written to.
該區塊可寫。

更多資料請參考官方文檔:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms680341(v=vs.85).aspx

例子:


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

-Advertisement-
Play Games
更多相關文章
  • 本文主要介紹在Ubuntu下Android開發環境的搭建,所使用的IDE為Eclipse(Android Studio同理,且可省去配置SDK以及安裝adt插件的步驟)。 1.安裝JDK (1)JDK8下載地址:http://www.oracle.com/technetwork/java/javas ...
  • swift 申明變數 var name = "Hello" //name會被自動識別成String 類型 或者指定變數類型: var name :String = "Hello" swift中用 + 做字元串連接 ,但是不可 + int 型。如果要加int 型,可採用如下的方法: var i = 2 ...
  • 一、概述 SQL Server提供了“分離/附加”資料庫、“備份/還原”資料庫、複製資料庫等多種資料庫的備份和恢復方法。這裡介紹一種學習中常用的“分離/附加”方法,類似於大家熟悉的“文件拷貝”方法,即把資料庫文件(.MDF)和對應的日誌文件(.LDF)拷貝到其它磁碟上作備份,然後把這兩個文件再拷貝到 ...
  • 面向對象1.類:眾多對象抽象出來的2.對象:類實例化出來的 3.類的定義關鍵字 class 4.類裡面包含成員變數成員屬性 成員方法 5.面向對象三大特性(1)封裝目的:保護類,讓類更加安全。做法:讓類裡面的成員變數變為私有的,做相應的方法或者屬性去間接的操作成員變數 封裝成員方法來間接操作類裡面的 ...
  • 結合實際的工作環境,在開始R研究的時候,首先著手收集的就是能以Web方式發佈R運行結果的基礎框架,無耐的是,R一直以來常使用於個人電腦的客戶端程式上,大家習慣性的下載R安裝包,在自己的電腦上安裝 --> 寫演算法 --> 運行 --> 以貼圖或者文檔的形式發表自己的作品。花了較長時間,終於找著了一套框 ...
  • 《SQL 必知必會》讀書筆記 -- 第9課 彙總數據 9.1 聚集函數:對某些行運行的函數,計算並返回一個值 案例: -- 確定表中函數 -- 獲得表中某些行的和 -- 找出表列的最大值、最小值和平均值等 --當我們實際想要彙總信息,而不是需要數據本身時,可節省時間和帶寬。 --表9-1 --函數 ...
  • 【BBED】bbed常用命令 一.1 相關知識點掃盲 BBED(Oracle Block Browerand EDitor Tool),用來直接查看和修改數據文件數據的一個工具,是Oracle一款內部工具,可以直接修改Oracle數據文件塊的內容,在一些極端恢復場景下比較有用。該工具不受Oracle... ...
  • 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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...