Je travaille sur des liaisons d'appel natif pour une machine virtuelle et une des fonctionnalités permet de rechercher des fonctions Standard Libc par son nom à l'exécution. Sous Windows, cela devient un peu tracas car je dois obtenir une poignée sur le module MSVCRT qui est actuellement chargée dans le processus. Normalement, il s'agit de MSVCRT.DLL, mais cela pourrait être d'autres variantes également (MSVCR100.dll, etc.) et un appel à GetModuleHandle ("MSVCRT") ("MSVCRT") pourrait échouer si une variante avec un nom différent est utilisée.
Ce que je voudrais Comme pour pouvoir faire est une recherche inversée, prenez un pointeur de fonction de Libc (que j'ai dans l'abondance) et obtenez une poignée au module qui le fournit. Fondamentalement, quelque chose comme ceci: p>
HANDLE hlibc = ReverseGetModuleHandle(fprintf); // Any func from libc should do the trick void *vfunc = GetProcAddress(hlibc);
3 Réponses :
MEMORY_BASIC_INFORMATION mbi;
HMODULE mod;
if (VirtualQuery( vfunc, &mbi, sizeof(mbi) ))
{
mod = (HMODULE)mbi.AllocationBase;
}
Ceci est un raccourci bien connu pour trouver la poignée du module à partir d'une adresse de code. Les manipulations de module remontent à partir des versions de 16 bits de Windows, sur les versions 32 bits et 64 bits de Windows La poignée du module est simplement l'adresse de base de l'allocation de mémoire. Je n'ai jamais vu cela échouer et utiliser le même tour dans mon code.
Cette méthode fonctionne effectivement, au moins sur les quelques variantes de fenêtres que j'ai essayées. Je n'aime pas le fait que ce n'est pas bien documenté, mais j'ai rempli mon code avec des commentaires décrivant ce qu'il fait, et je vais juste espérer le meilleur. Merci!
La manière documentée existe. Voir ma réponse.
Malheureusement, vous devrez parcourir des modules comme vous craigniez. Ce n'est pas trop mauvais cependant. Voici l'idée, un code écrit dans le bloc-notes:
La manière documentée d'obtenir la poignée du module consiste à utiliser 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.
}