2010-01-26 10 views
8

क्या सी ++ में एक डीएलएल को हुक करने का कोई त्वरित तरीका है? मुझे पता है कि माइक्रोसॉफ्ट की Detours चीज है, लेकिन क्या कुछ डीएलएल कार्यों को हुक करने के लिए कोई आसान तरीका नहीं है?सी ++ एक डीएलएल hooking?

उदाहरण के लिए मैं डीएल mytestdll.dll से hook_mytestfunction() में void mytestfunction() फ़ंक्शन को हुक करना चाहता हूं।

अग्रिम धन्यवाद!

+0

क्या आप अपनी प्रक्रिया के अंदर एक डीएलएल को हुक करने की कोशिश कर रहे हैं, या एक डीएलएल जिसे किसी अन्य प्रक्रिया में लोड किया गया है? –

+0

एक डीएल में उपयोग किए जाने वाले सभी कार्यों को जोड़ने के लिए उपलब्ध रणनीतियों केवल उपयोग किए गए कार्यों में से एक को जोड़ने के लिए स्ट्रैटजीज़ से अलग हैं। प्रक्रिया रणनीतियों में प्रक्रिया रणनीतियों से अलग हैं। क्या आप कुछ और विवरण दे सकते हैं? –

+0

हाँ, किसी अन्य प्रक्रिया से एक डीएलएल को हुक करने की कोशिश कर रहा है। उदाहरण के लिए कुछ इसी तरह की तरह opengl32.dll फ़ाइल को हुक करने और glbegin..glEnd और आदि को अवरुद्ध करने जैसा होगा ... – enuree

उत्तर

3

मार्ग-परिवर्तन त्वरित और आसान तरीका है!

+2

यदि आप 64 बिट में काम करना चाहते हैं, तो आपको 10k $ लाइसेंस शुल्क का भुगतान करना होगा :( – CharlesB

3

आप एक DLL है कि आप उस DLL के निर्यात hooking रहे hooking रहे हैं, तो मुझे लगता है?

उस मामले आप एक सरल आई ए टी प्रदर्शन कर सकते हैं (और संभवत: खाओ यदि आवश्यक हो) हुक में।

आई ए टी का लाभ/मार्ग-परिवर्तन से अधिक खाते हैं हुक है कि आवेदन और हुक को हटाने के 100% सुरक्षित है (जैसा कि आप कोड की जगह नहीं कर रहे हैं, तो आप एक सूचक बदल रहे हैं, तो वहाँ एक दौड़ का कोई मौका नहीं है हालत), और देशी x64 प्रक्रियाओं पर भी हुक करना आसान है (जो माइक्रोसॉफ्ट की डेटोरस लाइब्रेरी तब तक नहीं कर सकती जब तक आप प्रोफेसर संस्करण के लिए 10 ग्रैंड नहीं निकालते)।

हां, तीसरे पक्ष के डिटोर पुस्तकालय हैं जिनके पास x64 समर्थन है और अधिकांश दौड़ की स्थिति का ख्याल रखना और क्या नहीं, लेकिन उनमें से कुछ वास्तव में महंगे हैं, और अन्य केवल काम करने के लिए दर्द हैं।

आईएटी/ईएटी हुक त्वरित और आसान हैं, और "विंडोज़ सी/सी ++" (इंटरवब्स पर स्थानों की भीड़ के साथ) पुस्तक में उन्हें प्रदर्शन करने के लिए नमूना कोड है।

यह एक काफी सामान्य जवाब मुझे पता है, लेकिन यह वास्तव में आप क्या करने की कोशिश कर रहे हैं क्या बारे में अधिक जानकारी के बिना और अधिक विस्तार में जाने के लिए मुश्किल है।

4

शायद सबसे आसान तरीका है EXE निर्देशिका में एक ही नाम साथ अपने स्वयं के आवरण DLL रखा, और एक नए नाम के साथ एक ही निर्देशिका में शौकीन DLL की एक प्रति डाल करने के लिए है। फिर, अपने रैपर डीएलएल के आईएटी में, किसी भी गैर-अवरुद्ध कॉल को लपेटा डीएलएल (निर्यात अग्रेषण) पर रीडायरेक्ट करें, और दूसरों को स्वयं लागू करें।

कार्यों अनुप्रेषित करने के लिए, अपने .def फ़ाइल में निम्न पंक्ति डाल: Foo=wrapped_mytestdll.Foo जहां फू (घायल) समारोह का नाम है और wrapped_mytestdll की नकल की DLL का नया नाम है।

नतीजतन, प्रभावित EXE अपने आवरण DLL लोड करता है, और बदले में लिपटे DLL। आपके रैपर डीएलएल में कार्य लपेटा डीएलएल पर प्राथमिकता लेते हैं। केवल कॉल रोक नहीं अपने आई ए टी के माध्यम से जाना नहीं है उन लोगों के रूप, जो अपने आप को लपेटा DLL के आधार पर कॉल कर रहे हैं।

(बाद में मैंने मूल ".DEF" फ़ाइल उत्पन्न करने के लिए a link to a tool पाया है, लेकिन मैंने इसे स्वयं परीक्षण नहीं किया है। अपने जोखिम पर उपयोग करें।)

2

बस GetProcAddress (एचडीएल, "mytestfunction") पर कॉल करें, और वहां jmp hook_mytestfunction लिखें, फिर hook_mytestfunction में mytestfunction की शुरुआत में निर्देश दें।

यह वास्तव में तेज़ और आसान है, बेशक यदि आप इसे समझते हैं। यदि आप नहीं करते हैं - एमएस डेटोर या अन्य लाइब्रेरी का उपयोग करें। आम तौर पर आप यह समझने के बिना कर सकते हैं कि यह कैसे काम करता है।

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