2011-07-18 15 views
7

Pracuję nad natywnymi połączeniami dla maszyny wirtualnej, a jedną z funkcji jest możliwość wyszukiwania standardowych funkcji libc według nazwy w czasie wykonywania. W przypadku okien staje się to trochę kłopotliwe, ponieważ potrzebuję uzyskać uchwyt do modułu msvcrt, który jest aktualnie załadowany w procesie. Zwykle jest to msvcrt.dll, ale mogą to być również inne warianty (msvcr100.dll, itp.) I wywołanie funkcji GetModuleHandle ("msvcrt") może się nie powieść, jeśli używany jest wariant o innej nazwie.Jak zdobyć Module HANDLE od func ptr w Win32?

Co chciałbym móc zrobić to odwrotne wyszukiwanie, wziąć wskaźnik funkcji z libc (który mam w obfitości) i uzyskać uchwyt do modułu, który je zapewnia. Zasadniczo coś takiego:

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

Czy istnieje coś takiego w Win32 API, bez schodząc do ręcznego odległości uchwytów procesowych i tabel symboli? I odwrotnie, jeśli mam zbyt duży problem, czy istnieje łatwiejszy sposób sprawdzenia funkcji libc po nazwie na win32?

Odpowiedz

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

Jak to dokładnie pomaga? –

+0

Czego mi brakuje? –

+0

Jest to dobrze znany skrót do znalezienia uchwytu modułu z adresu kodu. Moduł obsługuje daty od 16-bitowych wersji systemu Windows, w 32-bitowych i 64-bitowych wersjach systemu Windows uchwyt modułu jest po prostu podstawowym adresem alokacji pamięci. Nigdy nie widziałem, aby to się nie udało i używaj tej samej sztuczki w moim kodzie. –

0

Niestety, będziesz musiał przejść przez moduły, tak jak się obawiałeś. Nie jest jednak tak źle. Oto pomysł, niektóre kod napisany w notatniku:

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

Istnieje rzeczywiście istnieje udokumentowany sposób, aby uzyskać adres ładowania modułu za pomocą :: GetModuleHandleEx() interfejsu API. Jedynym możliwym brakiem w tej funkcji jest to, że nie jest ona obsługiwana w Win2K, co obecnie może nie być przeszkodą. Oto próbka:

HMODULE hmodule = NULL; 

::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast<LPCTSTR>(address), &hmodule); 
// hmodule should now refer to the module containing the target address. 

Dla porównania: http://msdn.microsoft.com/en-us/library/windows/desktop/ms683200(v=vs.85).aspx

UPD: Można też określić flagę GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT w celu uniknięcia blokady semantykę na module znaleźć.

+1

Należy również podać GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, aby liczba odwołań nie wzrosła, a funkcja zachowywała się podobnie jak GetModuleHandle() – pHiL

Powiązane problemy