bool enumeattable(pvoid pmodulebase)
//下面的操作會使pdosheader->e_lfanew的值乘以64,再進行相加,
//由於pdosheader為指標型別,因此在進行相加時,會乘以結構體的大小
//pntheader = (pimage_nt_headers)(pdosheader + pdosheader->e_lfanew);
//這種方式是將指標直接轉為ulong型別,排除指標的影響,進行位址計算。
pntheader = (pimage_nt_headers)((ulong)pdosheader + pdosheader->e_lfanew);
//這種方式是將結構體的指標,轉為位元組指標,由於位元組指標長度為1,乘以位元組指標長度也無影響。
pntheader = (pimage_nt_headers)((byte *)pdosheader + pdosheader->e_lfanew);
if(pntheader->signature != image_nt_signature)
pexporttable = (pimage_export_directory)((ulong)pmodulebase + pntheader->optionalheader.datadirectory[image_directory_entry_export].virtualaddress);
arrayoffunctionaddress = (ulong_ptr *)((ulong)pmodulebase + pexporttable->addressoffunctions);
arrayoffunctionname = (ulong_ptr *)((ulong)pmodulebase + pexporttable->addressofnames);
arrayoffunctionordinals = (word *)((ulong)pmodulebase + pexporttable->addressofnameordinals);
for(int i = 0; i < pexporttable->numberoffunctions; i++)
}
PE總結 匯出表
當pe檔案被執行的時候,windows裝載器將檔案裝入記憶體並將匯入表中登記的dll檔案一併裝入,再根據dll檔案中的函式匯出資訊對被執行檔案的iat表進行修正。windows 在載入乙個程式後就在記憶體中為該程式開闢乙個單獨的虛擬位址空間,這樣的話在各個程式自己看來,自己就擁有幾乎任意位址的支配權...
PE結構 匯出表
那麼,作業系統是如何來獲取函式位址呢,也就是getprocaddress的實現,這裡就涉及到了匯出表。匯出表,會記錄這個庫函式的位址是多少,所以簡單來說getprocaddress就是查匯出表來獲取位址,如何查就是下面的話題了。匯出意味著需要提供api給他人使用,一般來說會是一些dll之類的,所以,...
PE檔案 匯入表,匯出表
typedef struct image import descriptor dword timedatestamp dword forwarderchain dword name 庫名稱字串位址 dword firstthunk iat的位址 typedef struct image data d...