2011-07-18 13 views
7

मैं वर्चुअल मशीन के लिए देशी कॉल बाइंडिंग पर काम कर रहा हूं, और सुविधाओं में से एक रनटाइम पर नाम से मानक libc फ़ंक्शंस को देखने में सक्षम होना है। विंडोज़ पर यह परेशानी का थोड़ा सा हो जाता है क्योंकि मुझे वर्तमान में प्रक्रिया में लोड किए गए msvcrt मॉड्यूल को एक हैंडल प्राप्त करने की आवश्यकता है। आम तौर पर यह msvcrt.dll है, लेकिन यह अन्य प्रकार भी हो सकता है (msvcr100.dll, आदि) और GetModuleHandle ("msvcrt") पर कॉल विफल हो सकता है यदि किसी भिन्न नाम वाले संस्करण का उपयोग किया जाता है।Win32 में func ptr से मॉड्यूल हैंडल कैसे प्राप्त करें?

मैं जो करने में सक्षम होना चाहता हूं वह एक रिवर्स लुकअप है, libc (जो मेरे पास बहुतायत में है) से फ़ंक्शन पॉइंटर लें और इसे प्रदान करने वाले मॉड्यूल पर एक हैंडल प्राप्त करें। असल में, कुछ इस तरह:

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

वहाँ Win32 एपीआई में ऐसी बात है, इस प्रक्रिया के हैंडल और प्रतीक तालिकाओं का एक पुस्तिका की पैदल दूरी में उतरते बिना है? इसके विपरीत, अगर मैं समस्या को अधिक सोच रहा हूं, तो Win32 पर नाम से libc फ़ंक्शन देखने का कोई आसान तरीका है?

उत्तर

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

यह वास्तव में कैसे मदद करता है? –

+0

मुझे क्या याद आ रही है? –

+0

यह एक कोड पते से मॉड्यूल हैंडल खोजने के लिए एक प्रसिद्ध शॉर्टकट है। मॉड्यूल 32-बिट और विंडोज़ के 64-बिट संस्करणों के विंडोज़ के 16-बिट संस्करणों से वापस दिनांक संभालता है, मॉड्यूल हैंडल बस स्मृति आवंटन का मूल पता है। मैंने कभी यह असफल नहीं देखा है और मेरे कोड में एक ही चाल का उपयोग किया है। –

0

दुर्भाग्यवश आपको डर के रूप में मॉड्यूल के माध्यम से चलना होगा। हालांकि यह बहुत बुरा नहीं है।

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

वहाँ वास्तव में एक प्रलेखित तरह से उपयोग करते हुए :: GetModuleHandleEx() API द्वारा मॉड्यूल लोड का पता प्राप्त करने के लिए मौजूद है: यहाँ विचार, कुछ कोड नोटपैड में लिखा है। इस फ़ंक्शन के साथ एकमात्र संभावित कमी यह है कि यह Win2K पर समर्थित नहीं है, जो आजकल बाधा नहीं हो सकती है।

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. 

संदर्भ के लिए: http://msdn.microsoft.com/en-us/library/windows/desktop/ms683200(v=vs.85).aspx

युपीडी: यहाँ नमूना है आपने जिन मॉड्यूल पाया पर ताला अर्थ विज्ञान से बचने के लिए GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT ध्वज को निर्दिष्ट कर सकते हैं।

+1

आपको GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT भी निर्दिष्ट करना चाहिए, इसलिए संदर्भ गणना बढ़ी नहीं है और फ़ंक्शन GetModuleHandle() की तरह व्यवहार करता है – pHiL

संबंधित मुद्दे