2011-12-05 6 views
7

मैं कुछ वांछित व्यवहार के लिए कुछ एप्लिकेशन में एक डाइलीब इंजेक्शन दे रहा हूं।ओएसएक्स पर सी ++ तरीके हुकिंग?

मैं फ्लैट सी एपीआई को ठीक से हुक करने में सक्षम हूं। एक बार जब मैं dylib इंजेक्ट करता हूं, तो मैं प्रतीक तालिका में देखता हूं और अपने फ़ंक्शन पते के साथ अपनी प्रविष्टि अपडेट करता हूं और बदले में मूल को कॉल करता हूं।

इस प्रकार, प्रतीक नाम मेरे लिए महत्वपूर्ण हो जाते हैं।

मेरी समस्या सी ++ नाम मैंगलिंग के साथ है। हम एक सी ++ फ़ंक्शन को कैसे लगा सकते हैं जिसका नाम उलझा हुआ है। मैंने स्टैक ओवरफ़्लो पर कुछ स्थानों को पढ़ा है, यह mach_override के साथ C++ कोड को हुक करना संभव है, लेकिन कोई उदाहरण या संदर्भ नहीं है।

क्या कुछ मुझे उदाहरण दे सकते हैं कि सी ++ की हुकिंग कैसे प्राप्त करें?

संपादित करें: मैं एक उदाहरण के रूप में $ c++filt -n _ZN10WindowData12GetCGContextEv का इस्तेमाल किया और मिल बाहर के रूप में WindowData::GetCGContext()

  1. WindowData कक्षा या नाम स्थान है डाल?
  2. मैं इसे कैसे हुक सकता हूं? मुझे हुकिंग के लिए विंडोडाटा :: GetCGContext() का उपयोग करने के लिए कुछ आगे की घोषणाओं और बहिष्कारों की आवश्यकता है।

इस तरह कुछ ...

typedef void* (*WindowData_GetCGContextProcPtr)(void* inObj); 
static WindowData_GetCGContextProcPtr gWindowDataGetCGContextProcPtr = NULL; 
void* try_WindowDataGetCGContextProcPtr(void* inObj) 
{ 
    printf("try_WindowDataGetCGContextProcPtr \n"); 

    return gWindowDataGetCGContextProcPtr(inObj); 
} 

अब, मैं इस विधि पैच करने के लिए चाहते हैं।

gWindowDataGetCGContextProcPtr = (WindowData_GetCGContextProcPtr)Patch((const void*)&WindowData::GetCGContext, (const void*)&try_WindowDataGetCGContextProcPtr); 

यह पैच संकलन त्रुटि देता है।

error: 'WindowData' has not been declared 
error: 'GetCGContext' was not declared in this scope 

मैं इसे कैसे ठीक करता हूं?

उत्तर

4

आप मैंगलिंग को डीकोड करने और इंजेक्शन करने के लिए c++filt का उपयोग कर सकते हैं।

लेकिन तरीकों कि अनुकूलक द्वारा inlined कर रहे हैं इस दृष्टिकोण

+0

धन्यवाद, मैं विधि नाम को उलझाने में सक्षम था। – MacGeek

0

ओएस एक्स पर साथ काम नहीं करेंगे, तो आप जीसीसी का उपयोग कर रहे संभालने, <cxxabi.h> में abi::__cxa_demangle समारोह सी ++ नाम demangle के लिए इस्तेमाल किया जा सकता है। आपको WindowData::GetCGContext के हस्ताक्षर से मेल खाने वाली विधि के लिए पॉइंटर असाइन करने की आवश्यकता नहीं है। हालांकि, इस वर्ग के लिए विनिर्देश अभी भी उपलब्ध कराने की जरूरत है।