學PE結構很長時間了,開始是從加密與解密的書上學到的,後來又看了一些其他的書,對PE的結構已經基本的瞭解了。但是因為很少用,所以也經常忘,尤其是匯入表與匯出表,裡面的具體結構經常混淆。
PE格式:
1。DOS Header
2.NT Header
3.Section Table
4.Section
DOS Header的最後一個標誌e_lfanew指示了NT Header的位置
NT Header結構
1.Signature
2.File Header
3.Optional Header
在Optional Header中又有三十幾項
其中最後一項是Data Directry,即資料目錄表,該項有十六項,每一項是一個IMAGE_DATA_DIRECTORY結構
IMAGE_DATA_DIRECTORY STRUCT
VirtualAddress dd ?
isize dd ?
IMAGE_DATA_DIRECTORY ENDS
資料目錄表的第一項指示了匯出表,第二項指示了匯入表
在第二項的VirtualAddress指向了IMAGE_IMPORT_DIRECPTOR數組的RVA
IMAGE_IMPORT_DESCRIPTOR STRUCT
union
Characteristics dd ?
OriginalFirstThunk dd ?
ends
TimeDateStamp dd ?
ForwarderChain dd ?
Name1 dd ?
FirstThunk dd ?
IMAGE_IMPORT_DESCRIPTOR ENDS
其中OriginalFirstThunk中儲存的是一個IMAGE_THUNK_DATA數組的RVA,每個IMAGE_THUNK_DATA又指向IMAGE_IMPORT_BY_NAME
IMAGE_IMPORT_BY_NAME STRUCT
Hint dw ?
Name1 db ?
IMAGE_IMPORT_BY_NAME ENDS
Hint指示本函數在其所駐留DLL的引出表中的索引號。該域被PE裝載器用來在DLL的引出表裡快速查詢函數。該值不是必須的,一些連接器將此值設為0。
Name1含有引入函數的函數名。函數名是一個ASCIIZ字串。注意這裡雖然將Name1的大小定義成位元組,其實它是可變尺寸域,只不過我們沒有更好方法來表示結構中的可變尺寸域。
在IMAGE_IMPORT_DIRECPTOR結構中的FirstThunk項,與OrignalFirstThunk類似,它也是一組IMAGE_THUNK_DATA的RVA,不過該項所指的內容可以改變,並且該項指示的是函數的地址(開始的時候並不指向函數地址,而是OrignalFirstThunk所指的IMAGE_THUNK_DATA中的值與FirstThunk所指的IMAGE_THUNK_DATA相同,在PE裝載時,改變的,每個IMAGE_THUNK_DATA是一個函數的地址