pe在載入前 int表和iat表都指向乙個名稱表
但是有些程式,如果你列印該程式的iat表的時候會指向位址中發現裡面是位址?
如果我們事先先把iat表中的所需要用到的dll函式位址都填好的話,是不是能夠節省程式啟動的時間?
那麼如何判斷該程式是否進行了繫結匯入的操作呢?
在檔案中iat表是否填寫位址,依據的地方 就是 匯入表中的 timedatestamp (時間戳)成員, 如果為0 則是這個dll沒有繫結, 如果為-1 則是這個dll進行了繫結匯入
如下圖:這個是進行了繫結匯入的操作,所以列印pimport_descriptor的timedatestamp為ffffffff,有符號也就是-1
怎麼判斷匯入表中的 iat表函式位址是否繫結 根據 timedatastamp進行判斷. 0未繫結 -1繫結
真正的繫結時間存放在繫結匯入表image_bound_import_descriptor的timedatestamp的屬性中
timedatestamp == 0 未繫結
timedatestamp == -1 已繫結
定位方法:
在pe可選頭結構中的資料目錄的第12項
typedef struct _image_bound_import_descriptor image_bound_import_descriptor, *pimage_bound_import_descriptor;
我們的乙個dll可能依賴其他的dll, 所以匯入表的最後乙個成員是依賴的dll有幾個,如果有兩個,那麼緊跟著下面就是依賴的dll的繫結匯入表結構
關於依賴dll的結構體如下:
typedef struct _image_bound_forwarder_ref image_bound_forwarder_ref, *pimage_bound_forwarder_ref;
列印繫結匯入表的**:
void printbindimporttable(pvoid pfilebuffer);
dword boung_import_descriptor_temp = null;
int i = 0;
dword rva = 0;
dword foa = 0;
pdosheader = (pimage_dos_header)pfilebuffer;
pntheader = (pimage_nt_headers)((dword)pfilebuffer+pdosheader->e_lfanew);
ppeheader = (pimage_file_header)(((dword)pntheader) + 4);
poptionheader = (pimage_optional_header32)((dword)ppeheader+image_sizeof_file_header);
psectionheader = (pimage_section_header)((dword)poptionheader + image_sizeof_nt_optional_header);
rva_to_foa(pfilebuffer, poptionheader->datadirectory[11].virtualaddress,&foa);
//儲存第乙個descriptor的位址 後面加offsetmodulename來進行使用
boung_import_descriptor_temp = (dword)pfilebuffer+(dword)foa;
//開始進行列印操作
PE檔案 匯入表,匯出表
typedef struct image import descriptor dword timedatestamp dword forwarderchain dword name 庫名稱字串位址 dword firstthunk iat的位址 typedef struct image data d...
PE檔案結構詳解(四)PE匯入表
pe檔案結構詳解 二 可執行檔案頭的最後展示了乙個陣列,pe檔案結構詳解 三 pe匯出表中解釋了其中第一項的格式,本篇文章來揭示這個陣列中的第二項 image directory entry import,即匯入表。也許大家注意到過,在image data directory中,有幾項的名字都和匯入...
PE檔案結構詳解(四)PE匯入表
pe檔案結構詳解 二 可執行檔案頭的最後展示了乙個陣列,pe檔案結構詳解 三 pe匯出表中解釋了其中第一項的格式,本篇文章來揭示這個陣列中的第二項 image directory entry import,即匯入表。也許大家注意到過,在image data directory中,有幾項的名字都和匯入...