逆向-PE導入表

導入表

動態連接庫須要導入表html

結構

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            // 0 for terminating null import descriptor
        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
    } DUMMYUNIONNAME;
    DWORD   TimeDateStamp;                  // 0 if not bound,
                                            // -1 if bound, and real date\time stamp
                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                            // O.W. date/time stamp of DLL bound to (Old BIND)

    DWORD   ForwarderChain;                 // -1 if no forwarders
    DWORD   Name;
    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;

OriginalFirstThunk:指向導入名稱表函數

FirstThunk:指向導入地址表this

Name:指向導入的dll名稱code

IMAGE_THUNK_DATA最高位爲1剩下的表示序號,最高位0剩下的表示RVA指向IMAGE_import_BY_NAME,裏面存着名字。htm

(圖片來源https://www.cnblogs.com/guanlaiy/archive/2012/04/28/2474504.html)blog

​ OriginalFirstThunk,FirstThunk在文件中同樣,只有PE加載的時候系統會根據INT表內容用GetProcAddress()或相似函數將IAT表中內容替換成DLL重載調整好位置的真實導入函數地址。它讀的是導出表函數的RVA加上調整好後的DLL的ImageBase。圖片

​ 至此導入表、導出表、重定位表功能就連起來了,重定位表只改本PE內容和別的PE無關,PE加載後大部分DLL須要重定位,這個時候imageBase也是真實的了,那麼導出函數的真實地址就能經過導出表的導出函數RVA加上真實的該PE的imageBase得到了。GetProcAddress返回給導入表刷新用。ip

相關文章
相關標籤/搜索