Как получить модуль HANDLE из func ptr в Win32? - PullRequest
8 голосов
/ 18 июля 2011

Я работаю над собственными привязками вызовов для виртуальной машины, и одной из функций является возможность поиска стандартных функций 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, не погружаясь в ручную прогулку по дескрипторам процесса и таблицам символов?И наоборот, если я слишком обдумываю проблему, есть ли более простой способ поиска функции libc по имени в win32?

Ответы [ 3 ]

18 голосов
/ 13 августа 2012

Документированный способ получения дескриптора модуля - использование 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.
}
9 голосов
/ 18 июля 2011
MEMORY_BASIC_INFORMATION mbi;
HMODULE mod;
if (VirtualQuery( vfunc, &mbi, sizeof(mbi) ))
{
    mod = (HMODULE)mbi.AllocationBase;
}
0 голосов
/ 18 июля 2011

К сожалению, вам придется проходить через модули, как вы боялись.Это не так уж плохо.Вот идея, код, написанный в блокноте:

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...