2014-02-21 29 views
1

再一次,對於不好的標題感到抱歉。代碼如何知道API函數的地址?

所以我上週一直在研究PE格式,而且我沒有完全得到一些東西。當一個進程加載時,所有的DLL都被映射到內存中。我不明白的是,因爲一個DLL可以加載到一個隨機的基地址,那麼.exe文件的代碼如何能夠知道API函數的地址?是否有一些「啓動代碼」,查找Kernel32.dll或什麼?我知道這個過程很容易使用GetProcAddress查找函數,但它如何獲取GetProcAddress的地址?

回答

4

所有Windows .EXE文件(以及所有.DLL文件,具體取決於其他.DLL文件)都有一個所謂的進口表。

此表包含所需的DLL和函數列表以及函數地址數組。

當.EXE文件加載到內存時,Windows將在內部爲所有DLL調用LoadLibrary,併爲該.EXE文件所需的所有API函數調用GetProcAddress。它將使用由GetProcAddress返回的值填充imports表中的數組。

如果GetProcAddress返回NULL,則表示該值未寫入數組,但加載.EXE文件將失敗!

+1

導入的地址是否始終相同?它如何獲得這個地址?此外,是否有每個加載的DLL的不同導入表,還是隻有一個導入表,其中每個DLL的所有功能都加載到哪裏? – user2073973

+0

dll知道函數的地址在哪裏。操作系統(和dll)知道dll作爲一個整體在太空中的位置。應用程序和dll都知道函數的名稱,因此應用程序會針對每個函數詢問dll,並且此時dll和/或操作系統會從導入表中知道每個項目所在的位置,並告知應用程序 –

+0

因此,當我調用LoadLibrary,它會自動將地址等添加到IAT中嗎? – user2073973

相關問題