【问题标题】:How to get Module HANDLE from func ptr in Win32?如何从 Win32 中的 func ptr 获取 Module HANDLE?
【发布时间】:2011-07-18 14:01:05
【问题描述】:

我正在处理虚拟机的本机调用绑定,其中一项功能是能够在运行时按名称查找标准 libc 函数。在 Windows 上,这有点麻烦,因为我需要获取进程中当前加载的 msvcrt 模块的句柄。通常这是 msvcrt.dll,但也可能是其他变体(msvcr100.dll 等),如果使用具有不同名称的变体,调用 GetModuleHandle("msvcrt") 可能会失败。

我想做的是反向查找,从 libc(我有很多)获取函数指针并获取提供它的模块的句柄。基本上是这样的:

HANDLE hlibc = ReverseGetModuleHandle(fprintf); // Any func from libc should do the trick
void *vfunc = GetProcAddress(hlibc);

在 win32 API 中是否有这样的东西,而不需要手动遍历进程句柄和符号表?反之,如果我想太多问题,有没有更简单的方法可以在 win32 上按名称查找 libc 函数?

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    获取模块句柄的文档化方法是使用GetModuleHandleEx

    HMODULE hModule = NULL;
    
    if(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
           GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, // behave like GetModuleHandle
           (LPCTSTR)address, &hModule))
    {
        // hModule should now refer to the module containing the target address.
    }
    

    【讨论】:

      【解决方案2】:
      MEMORY_BASIC_INFORMATION mbi;
      HMODULE mod;
      if (VirtualQuery( vfunc, &mbi, sizeof(mbi) ))
      {
          mod = (HMODULE)mbi.AllocationBase;
      }
      

      【讨论】:

      • 这是从代码地址查找模块句柄的众所周知的快捷方式。模块句柄可以追溯到 16 位版本的 Windows,在 32 位和 64 位版本的 Windows 上,模块句柄只是内存分配的基地址。我从未见过这种失败并在我的代码中使用相同的技巧。
      • 这种方法确实有效,至少在我尝试过的几个 Windows 变体上是这样。我不喜欢它没有充分记录的事实,但我已经用 cmets 填充了我的代码,描述了它的作用,我只希望最好。谢谢!
      • 记录的方式存在。看我的回答。
      【解决方案3】:

      不幸的是,您将不得不像您担心的那样遍历模块。不过还不错。这是想法,用记事本编写的一些代码:

      MODULEENTRY32 me = {0};
      HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, 0 );
      
      me.dwSize = sizeof me;
      Module32First( hSnapshot, &me );
        if( me.modBaseAddr <= funcPtr &&
            ( me.modBaseAddr + me.modBaseSize ) > funcPtr ) {
          ...
          break;
        }
      do {
      } while( Module32Next( hSnapshot, &me ) );
      
      CloseHandle( hSnapshot );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        相关资源
        最近更新 更多