PE檔案格式學習(十六):延遲載入表
阿新 • • 發佈:2018-11-11
1.介紹
延遲載入表本質上跟繫結匯入表的目的是一樣的,都是為了加快程式載入檔案的速度,只不過方法不一樣。
延遲載入是指在呼叫某個DLL時才去載入,目的是為了避免在程式啟動之初就載入了不必要的DLL而浪費了時間。微軟建議在兩種情況下使用延遲載入:
- 程式並非在啟動時就會呼叫DLL裡面的函式
- 程式未必會呼叫該DLL裡面的函式
延遲載入表不是系統支援的一個特性,它是由編譯器控制的。
2.分析
我們還是使用之前使用過的程式:Win7下的mspaint.exe。這個程式的延遲載入表的RVA是85ccch,轉換成offset是850cch:
它的結構體是:
typedef struct ImgDelayDescr { DWORD grAttrs; RVA rvaDLLName; RVA rvaHmod; RVA rvaIAT; RVA rvaINT; RVA rvaBoundIAT; RVA rvaUnloadIAT; DWORD dwTimeStamp; } ImgDelayDescr, * PImgDelayDescr;
grAttrs:延遲匯入結構的屬性,0x1為新版本,0x0為老版本,對應上圖中的0x00000001
rvaDLLName:dll名字的RVA,對應上圖的0x85d40,轉為offset是0x85140,下圖是對應的dll名
rvaHmod:dll控制代碼的RVA,對應上圖的0x8bd78
rvaIAT:IAT表的RVA,對應上圖的0x8a000
rvaINT:INT表的RVA,對應上圖的0x85d4c
rvaBoundIAT:繫結匯入表的RVA,對應上圖的0
rvaUnloadIAT:原始IAT的可選拷貝的RVA,對應上圖的0
dwTimeStamp:延遲載入DLL的時間戳,通常為0