【问题标题】:GetProcAddress doesn't return the real address for LoadLibraryAGetProcAddress 不返回 LoadLibraryA 的真实地址
【发布时间】:2017-05-24 16:49:48
【问题描述】:
DWORD dwLoadLibrary = (DWORD)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");

当我转到 OllyDbg 中的返回地址时,我可以看到该地址指向的代码跳转到 LoadLibraryA 的真实地址。我想获取 LoadLibraryA 的真实地址,它不会改变,因为 kernel32.dll 在每个进程中都加载到相同的位置,而且我想知道为什么 GetProcAddress 不返回真实地址。

【问题讨论】:

  • 不使用(DWORD) 作为 pointer 即使您决定只为 32 位平台编码(这很奇怪)。改用DWORD_PTRvoid*

标签: windows winapi assembly dll loadlibrary


【解决方案1】:

您将获得kernel32.LoadLibraryA 的“真实”地址,因为GetProcAddress() 返回真实地址。只是kernel32.LoadLibrayA的实现从kernel32.dll转移到kernelbase.dll,结果kernel32.LoadLibraryA只包含一条指令:

jmp dword ptr[kernelbase.LoadLibraryA]

如果您查看kernel32.dll 中的更多功能,其中许多功能也具有相同的模式:

kernel32.somefunc:
    jmp [kernelbase.somefunc]

【讨论】:

    【解决方案2】:

    这是LoadLibraryA 的“真实”地址。跳转指令用于工具在那里放置间接。他们会将该跳转的目标地址与其他东西交换,指向钩子,并在执行钩子后跳转到原始位置以实际执行函数。

    【讨论】:

    • 是不是说GetProcAddress为LoadLibraryA返回的地址在每个进程中都没有变化?
    • 这取决于动态链接器,所以是的,它可以改变。
    • 不,这不是钩子,LoadLibraryA 的点没有改变
    【解决方案3】:

    你怎么知道不是@​​987654321@的真实地址?也许改用 WinDbg?

    在我的 Windows 8 系统上,GetProcAddress(x, "LoadLibraryA") 返回一个以正常的mov edi,edi 热补丁保留(以及该函数的其余部分)开头的函数,但这并不意味着它不能在其他版本中以跳转开头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2022-07-06
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多