getprocaddress与dll和exe不同

时间:2012-02-29 14:28:31

标签: dll exe getprocaddress

我正在尝试使用GetProcAddress获取GetProcAddress的地址(是的。自己调用它)。 当我从一个空的exe项目中执行它时,我得到一个有效的地址(在kernel32的分配地址之间)。

当我从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运行时它会返回相同的无效地址...

请帮忙。

2 个答案:

答案 0 :(得分:0)

Exe通常在其首选地址加载,当DLL选择ASLR时以及需要重定位时(例如,已经采用了它们的首选地址),DLL通常会重新定位(不在其首选地址加载)。这可以解释您在行为之间经历的增量。

答案 1 :(得分:0)

好的,我发现了这个问题。当我用rundll32加载dll时,它表现得很奇怪......当我自己构建一个加载器(loadlibrary,比getprocaddress)时,它运行正常。 rundll32是导致问题的那个