【问题标题】:Get function address from 64bit kernel32.dll using 32bit app使用 32 位应用程序从 64 位 kernel32.dll 获取函数地址
【发布时间】:2015-12-21 12:20:39
【问题描述】:

我有在64bit Windows (WOW64) 上运行的32bit 应用程序。 我需要知道来自kernel32.dll 的几个WinAPI 函数的地址。

A 可以轻松获取32bit kernel32.dll 中的函数地址:GetProcAddress 效果很好。

但 Windows 为 32bit64bit 应用程序提供了不同的 kernel32.dll(或映射到应用程序地址空间中不同地址的库 - 我不确切知道)。 并且WinAPI函数在32bit应用中的地址与64bit应用中的不同。

如何使用32bit 应用程序从64bit kernel32.dll 获取函数地址? 我不想为了知道所需函数的地址而启动单独的64bit 进程。

【问题讨论】:

  • 启动一个单独的 64 位进程并完成它。可能即使这样也无济于事,因为您无法从 32 位进程中创建 64 位进程中的远程线程。我想这就是你想要做的。
  • 感谢您的帮助。我不知道 CreateRemoteThread 对于 x32->x64 总是失败
  • 你需要一个 64 位的注入器,所以我认为这就是你的答案
  • 是的,我得到了同样的结论))
  • 从二进制文件导出的符号的 RVA(相对虚拟地址)是一个常量值,在编译时已知。 RVA + HINSTANCE 模块 == 地址(HINSTANCE 与 HMODULE 相同)。

标签: c++ winapi 64-bit 32-bit getprocaddress


【解决方案1】:

我认为这个问题没有意义。由于 ASLR,您只能询问“将 DLL 加载到我的进程中时函数的地址是什么(*)”,而不能将 64 位 DLL 加载到 32 位进程中。

(*) 在特定启动后运行的每个进程的答案当前可能是相同的,但我敢打赌 API 支持每个进程的 kernel32.dll 的不同地址。

(当然,64 位的值很可能比 32 位的指针大得多。)

【讨论】:

  • kernel32 不受 ASLR 约束。它在系统范围内具有相同的基地址:nynaeve.net/?p=198
  • 同意,但我的观点是 GetProcAddress API(和类似的)不会公开该细节。 “系统范围内相同的基地址”是我想说的“在特定启动后运行的每个进程都相同”。
猜你喜欢
  • 2019-03-07
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多