[PE結構分析] 9.導出表 IMAGE_EXPORT_DIRECTORY

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

typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // 未使用,總為0 DWORD TimeDateStamp; // 文件創建時間戳 WORD MajorVersion; // 未使用,總為0 WORD MinorVer... ...


typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;    // 未使用,總為0 
    DWORD   TimeDateStamp;      // 文件創建時間戳
    WORD    MajorVersion;       // 未使用,總為0 
    WORD    MinorVersion;       // 未使用,總為0
    DWORD   Name;               // 指向一個代表此 DLL名字的 ASCII字元串的 RVA
    DWORD   Base;               // 函數的起始序號
    DWORD   NumberOfFunctions;  // 導出函數的總數
    DWORD   NumberOfNames;      // 以名稱方式導出的函數的總數
    DWORD   AddressOfFunctions;     // 指向輸出函數地址的RVA
    DWORD   AddressOfNames;         // 指向輸出函數名字的RVA
    DWORD   AddressOfNameOrdinals;  // 指向輸出函數序號的RVA
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

AddressOfFunctions 所指向內容是以 4 位元組為一個單位的數組元素,每個元素代表函數入口

AddressOfNames 所指向內容是以 4 位元組為一個單位的數組元素,每個元素代表一個指向字元串的 RVA

AddressOfNamesOrdinals 所指向內容是以 2 位元組為一個單位的數組元素,每個元素代表對應名字在 AddressOfFunctions 中的序號數。

AddressOfNames 和 AddressOfNamesOrdinals 的數目肯定是一樣的,不是一樣那麼就出錯了。

主要要掌握兩種尋找函數入口地址的方法:

A. 從序號查找函數入口地址

1. 定位到PE 文件頭
2. 從PE 文件頭中的 IMAGE_OPTIONAL_HEADER32 結構中取出數據目錄表,並從第一個數據目錄中得到導出表的RVA
3. 從導出表的 Base 欄位得到起始序號
4. 將需要查找的導出序號減去起始序號Base,得到函數在入口地址表中的索引,檢測索引值是否大於導出表的 NumberOfFunctions 欄位的值,如果大於後者的話,說明輸入的序號是無效的
5. 用這個索引值在 AddressOfFunctions 欄位指向的導出函數入口地址表中取出相應的項目,這就是函數入口地址的RVA 值,當函數被裝入記憶體的時候,這個RVA 值加上模塊實際裝入的基地址,就得到了函數真正的入口地址

B. 從函數名稱查找入口地址

我想通的地方,記錄下來:用函數名來查找的話,Base 的值現在沒有任何意義

1. 首先得到導出表的地址
2. 從導出表的 NumberOfNames 欄位得到已命名函數的總數,並以這個數字作為迴圈的次數來構造一個迴圈,從 AddressOfNames 欄位指向得到的函數名稱地址表的第一項開始,在迴圈中將每一項定義的函數名與要查找的函數名相比較,如果沒有任何一個函數名是符合的,表示文件中沒有指定名稱的函數。
3. 如果某一項定義的函數名與要查找的函數名符合,那麼記下這個函數名在字元串地址表中的索引值,然後在AddressOfNamesOrdinals 指向的數組中以同樣的索引值取出數組項的值,我們這裡假設這個值是 x
4. 最後,以 x 的值作為索引值在 AddressOfFunctions  欄位指向的函數入口地址表中獲取 RVA 。此 RVA 就是函數的入口地址。

附上圖片:

PE-Export-table


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

-Advertisement-
Play Games
更多相關文章
  • 問題分析 當數據量很大的時候,所有數據都集中在一個文本文件中的話,讀寫會很困難,記憶體消耗大,速度很慢 操作很麻煩,因為讀寫都要根據指定的格式盡心解析,不通用 每次獲取數據都要全部數據重新讀寫,不能通過對索引對指定的數據進行讀寫 數據衝突的解決方案要完全依賴Java app去實現 更多的功能,像排序, ...
  • MySQL的升級相對來說還是比較簡單的。 它支持兩種方式的升級: 原地升級(In-place Upgrade) 關閉資料庫,替換舊的二進位文件,重啟資料庫,執行mysql_upgrade 邏輯升級(Logical Upgrade) 用mysqldump導出數據,安裝新的資料庫版本,將數據導入到新的數 ...
  • 假設你創建一個資料庫時,指定其初始化大小(SIZE )非常大。例如,如下測試案例所示 USE [master]GO CREATE DATABASE [TEST] ON PRIMARY ( NAME = N'TEST_Data', FILENAME = N'D:\SQL_DATA\TEST_Data.... ...
  • 1: 新增欄位: 2:刪除欄位: 3:修改欄位名: 4:修改欄位類型: ...
  • 環境:準備測試前,我查看了一下我公司的電腦是4核的(四個子視窗) 廢話少說,直接附上代碼和結果吧 測試代碼 運行結果: 資料庫的結果: 看到了吧,確實插入了1000萬條,準確無誤 然後我就想試試20個線程,每個線程插入50萬條數據看看性能怎麼樣。結果如下: 線程越多不是好事,反而更慢。。。 當線程達 ...
  • 為了保證臨界資源的安全性和可靠性,線程不得不使用鎖,同一時間只允許一個或幾個線程訪問變數。常用的鎖有互斥量,讀寫鎖,條件變數 一、互斥量 互斥量是用pthread_mutex_t數據類型表示的,在使用之前,必須對其進行初始化,可以把它設置為PTHREAD_MUTEX_INITIALIZER(只適於靜 ...
  • 一 、安裝java jdk配置環境變數 1、 卸載原有openjdk yum -y remove java-1.7.0-openjdk* yum -y remove tzdata-java.noarch 2、 下載新的jdk 並解壓 [root@localhost java]# curl -O ht ...
  • 很多kali愛好者想把kali linux作為系統使用,但是有些win下的程式有時候也需要用到,此時需要虛擬機。 kali系統在安裝虛擬機的時候也會遇到一大堆坑,接下來是我的爬坑過程。 一波三折。 環境 :kali linux 2.0 32位 軟體 :virtualbox 虛擬機 0x01 bash ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...