資料目錄項的第乙個結構,就是匯出表.
typedef struct _image_data_directory image_data_directory, *pimage_data_directory;
virtualaddress 匯出表的rva
size 匯出表大小
dword pexporttboffset = rva2offset(pntheaders, pntheaders->optionalheader.datadirectory[0].virtualaddress); //注意這個virtualaddress是va
pexporttable = (pimage_export_directory)(pexporttboffset+filebuffer);
上面的結構,只是說明匯出表在**,有多大,並不是真正的匯出表.
如何在filebuffer中找到這個結構呢?在virtualaddress中儲存的是rva,如果想在filebuffer中定位
必須要先將該rva轉換成foa.
真正的匯出表結構如下:
typedef struct _image_export_directory image_export_directory, *pimage_export_directory;
dword* pdwfunctionaddress = (dword*)(rva2offset(pntheaders, (dword)pexporttable->addressofnames)+(dword)filebuffer);
word* pwordinals = (word*)(rva2offset(pntheaders, (dword)pexporttable->addressofnameordinals)+(dword)filebuffer);
dword* pdwnamesaddress = (dword*)((dword)filebuffer + rva2offset(pntheaders, pexporttable->addressofnames));
int i = 0;
for(i;i<(int)pexporttable->numberofnames;i++)
#include #include unsigned char* filebuffer(const char* filename);
void importtable();
unsigned char* rvatofva(unsigned char* filebuffer,unsigned char* x);
dword rva2offset(pimage_nt_headers pntheader, dword dwrva);
void main()
void importtable()
}//將pe檔案讀到filebuffer
unsigned char* filebuffer(const char* filename)
dword rva2offset(pimage_nt_headers pntheader, dword dwrva)
}return 0;
}
PE匯出表操作
bool enumeattable pvoid pmodulebase 下面的操作會使pdosheader e lfanew的值乘以64,再進行相加,由於pdosheader為指標型別,因此在進行相加時,會乘以結構體的大小 pntheader pimage nt headers pdosheader...
PE總結 匯出表
當pe檔案被執行的時候,windows裝載器將檔案裝入記憶體並將匯入表中登記的dll檔案一併裝入,再根據dll檔案中的函式匯出資訊對被執行檔案的iat表進行修正。windows 在載入乙個程式後就在記憶體中為該程式開闢乙個單獨的虛擬位址空間,這樣的話在各個程式自己看來,自己就擁有幾乎任意位址的支配權...
PE結構 匯出表
那麼,作業系統是如何來獲取函式位址呢,也就是getprocaddress的實現,這裡就涉及到了匯出表。匯出表,會記錄這個庫函式的位址是多少,所以簡單來說getprocaddress就是查匯出表來獲取位址,如何查就是下面的話題了。匯出意味著需要提供api給他人使用,一般來說會是一些dll之類的,所以,...