2012-02-29 69 views
0

我想獲取GetProcAddress的地址與GetProcAddress(是的,調用它本身)。 當我從一個空的EXE項目做的時候,我得到一個有效的地址(在kernel32的分配地址之間)。getprocaddress不同於一個DLL和一個EXE

當我從一個DLL調用它,我收到無效的地址(而不是在分配KERNEL32的範圍)

的區別是什麼? 我在64位Windows 7上運行。

該項目被編譯爲32位。 這裏是我正在運行的代碼:

typedef FARPROC(WINAPI * GetProcAddressType)(HMODULE,LPCSTR);

HMODULE kernel32Hmodule = LoadLibraryW(L「c:\ windows \ system32 \ kernel32.dll」);

GetProcAddressType abc =(GetProcAddressType)GetProcAddress(kernel32Hmodule,「GetProcAddress」);

我也嘗試得到這樣的地址:void * a = GetProcAddress; ,但它從一個DLL運行時返回相同的無效地址...

請幫助。

回答

0

好的我發現了這個問題。當我用rundll32加載DLL時,它的行爲很奇怪...當我自己構建一個加載器時(loadlibrary,比getprocaddress)它工作正常。 rundll32是造成問題的原因之一

0

exe通常被加載到它們的首選地址,當它們選擇ASLR並需要重定位時(例如,它們的首選地址已被佔用),DLL通常會重新定位(不會在其首選地址加載)。這可以解釋你在這些行爲之間經歷的三角洲。

+0

Kernel32.dll沒有得到重定位。直到重新啓動後,ASLR偏移纔會更改。 – 2012-03-03 17:37:56

+0

正確Hans,我忘了這個,謝謝!這就是爲什麼我寫了「可以解釋......」:-) – mox 2012-03-04 01:15:26

+0

好的,我發現這個問題。 當我用rundll32加載dll時,它的行爲很奇怪...當我自己構建一個加載程序(loadlibrary,比getprocaddress)它工作正常。 rundll32是造成問題的原因之一 – 2012-03-04 07:58:14

相關問題