如何从Win32中的func ptr获取Module HANDLE?

我正在为虚拟机进行本机调用绑定,其中一个function是能够在运行时按名称查找标准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函数?

 MEMORY_BASIC_INFORMATION mbi; HMODULE mod; if (VirtualQuery( vfunc, &mbi, sizeof(mbi) )) { mod = (HMODULE)mbi.AllocationBase; } 

获取模块句柄的文档记录方法是使用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. } 

不幸的是,你必须像你担心的那样走过模块。 但这并不算太糟糕。 这是一个想法,一些用记事本写的代码:

 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 );