0

我正在尝试使用 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 运行时它返回相同的无效地址...

请帮忙。

4

2 回答 2

0

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

于 2012-03-03T17:22:47.157 回答
0

好的,我发现了问题。当我用 rundll32 加载 dll 时,它的行为很奇怪......当我自己构建一个加载器(loadlibrary,而不是 getprocaddress)时,它工作得很好。rundll32 是导致问题的原因之一

于 2012-03-04T07:59:43.763 回答