1. 程式人生 > >PE檔案格式學習(十六):延遲載入表

PE檔案格式學習(十六):延遲載入表

1.介紹

延遲載入表本質上跟繫結匯入表的目的是一樣的,都是為了加快程式載入檔案的速度,只不過方法不一樣。
延遲載入是指在呼叫某個DLL時才去載入,目的是為了避免在程式啟動之初就載入了不必要的DLL而浪費了時間。微軟建議在兩種情況下使用延遲載入:

  1. 程式並非在啟動時就會呼叫DLL裡面的函式
  2. 程式未必會呼叫該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