1. 程式人生 > >WinPE基礎知識之導出表

WinPE基礎知識之導出表

rom 順序 文件 exp 兩個 虛擬地址 src color 個數

// 導出的東西包括函數(變量、類)地址,序號,函數(變量、類)名
typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;  // (沒用) 保留值,恒為0
    DWORD   TimeDateStamp;    // (沒用) 和文件頭中的時間一樣的
    WORD    MajorVersion;     // (沒用) 主版本號
    WORD    MinorVersion;     // (沒用) 次版本號
    DWORD   Name;             // (有用) 本PE文件的名字,也就是誰導出的這些函數(變量,類)
DWORD Base; // (有用) 序號基數 DWORD NumberOfFunctions; // (重要) 函數數量 DWORD NumberOfNames; // (重要) 函數名稱數量 DWORD AddressOfFunctions; // (重要) 函數地址表的相對虛擬地址 // RVA from base of image DWORD AddressOfNames; // (重要) 函數名稱表的相對虛擬地址 DWORD AddressOfNameOrdinals; //
(重要) 序號的相對虛擬地址 } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
A:導出表應該被安排在.edata中,不過這個段一般都會合並到.rdata中。 B:有一個序號基數,通過序號表得到的序號再加上這個序號基數才是真正的函數序號。 C:導出的函數地址表、序號表、函數名稱表的關系。 (1)序號不是按順序排列的; (2)序號與函數名是一一對應的,兩個表中相同位置的元素相對應。這也說明了結構體中為什麽沒有序號的數量,因為序號的數量和函數名的數量是一樣的; (3)序號會有中斷,比如可能會沒有1,有2 ,沒有5,有6,但是這並不代表缺失的這個序號沒有所對應的函數地址
; (4)函數個數會比函數名個數多,多出來的這些函數,可能是用序號導出的函數,也可能是一個無效函數,地址填充0; (5)序號表元素的值,對應著函數地址表的位置,那一個位置中的函數地址,是這個序號所對應的函數名的函數地址,由此,三個表聯系起來; (6)函數地址表中元素,有地址值,但是序號表中沒有序號與之對應,說明這是一個序號導出元素,這個序號成為虛序號沒有函數名,它的序號就是它自己在函數地址表中的位置;(當然這個位置加上序號基數,才是它真正的序號) (7)函數地址表中元素,填充為0,說明這是一個無效的函數,也不會有序號與函數名與之對應

舉例

技術分享圖片

技術分享圖片

函數表中有5、7兩個位置是無效函數;2,3,4,6,8位置是函數名導出的(要註意函數名的位置與地址表中地址的位置並不相同);1,9是序號導出的函數,序號就是它本身的位置。

技術分享圖片

WinPE基礎知識之導出表