【问题标题】:getprocaddress acting different from a dll and an exegetprocaddress 与 dll 和 exe 不同
【发布时间】:2012-02-29 14:28:31
【问题描述】:

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

请帮忙。

【问题讨论】:

    标签: dll exe getprocaddress


    【解决方案1】:

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

    【讨论】:

    • Kernel32.dll 不会重新定位。 ASLR 偏移在重新启动之前不会改变。
    • 正确的汉斯,我忘记了,谢谢!这就是我写“可以解释...”的原因:-)
    • 好的,我发现了问题。当我用 rundll32 加载 dll 时,它的行为很奇怪......当我自己构建一个加载器(loadlibrary,而不是 getprocaddress)时,它工作得很好。 rundll32 是导致问题的原因
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 2017-09-19
      相关资源
      最近更新 更多