2012-05-20 57 views
0

當我在我的進程中加載​​dll時,該dll如何解析它導入的函數的地址? 我試着在GetProcAddress和LdrGetProcedureAddress上設置斷點,但它並沒有在那裏突破。DLL如何解決它的IAT?

請有人解釋。

+3

嗯,這不會發生什麼變化。它是Windows加載程序來照顧它的。它不需要使用GetProcAddress,它可以直接訪問導入表中的原始數據。這需要很快。 –

+0

你想要做一些特定的事情嗎?或者你只是好奇? – linuxuser27

+0

如果你想在加載DLL時中斷,可以使用windbg:http://stackoverflow.com/questions/1366051/windbg-setting-conditional-breakpoint –

回答

3

加載DLL時,加載程序會根據需要更新所有地址,以反映加載DLL的基址。

http://msdn.microsoft.com/en-us/magazine/bb985014.aspx

當創建一個DLL中,接頭假定DLL將在 特定地址加載。代碼和數據的某些部分包含 硬編碼地址,這些地址只有在DLL加載到 首選地址時纔是正確的。但是,在運行時,操作系統可能不得不在不同的內存位置加載DLL。

要處理操作系統必須移動DLL的情況,連接器 會將基址重定位添加到DLL。基址重定位是 需要修改的地址,以便它們包含正確的地址,用於將DLL加載到內存中的 。 DLL具有的基地址越多,操作系統需要處理它們和加載DLL的時間就越多。 A 基於正確的DLL加載到其首選地址,並且可以跳過處理基本重定位記錄的 。

這些日子更常見的是,DLL的基地址被隨機化爲安全措施,上述文章早於此。另請參閱:

Relocation (Wikipedia)

Portable Executable (Wikipedia)