2008-11-04 10 views
18

में कार्यक्षमता को इंजेक्ट करने का सबसे अच्छा तरीका बाइनरी एप्लिकेशन (3 डी पार्टी, बंद स्रोत) में कार्यक्षमता डालने का सबसे अच्छा तरीका क्या होगा।बाइनरी

लक्ष्य एप्लिकेशन ओएसएक्स पर है और ऐसा लगता है कि जीसीसी 3+ का उपयोग करके संकलित किया गया है। मैं बाइनरी में कार्यान्वित कार्यों की सूची देख सकता हूं और एक विशेष कार्य को डीबग और अलग कर दूंगा जिसे मैं दूरस्थ रूप से कॉल करना चाहता हूं।

विशेष रूप से, मैं इस फ़ंक्शन को कॉल करना चाहता हूं - चलो इसे zoomByFactor(x,y) पर कॉल करें - जब मुझे जटिल HIDevice से कुछ डेटा प्राप्त होता है।

मैं बाइनरी फ़ाइल में निर्देशों को आसानी से संशोधित या इंजेक्ट कर सकता हूं (यानी पैचिंग को केवल रैम में होने की आवश्यकता नहीं है)।

आप इसे "अच्छी तरह से" करने के तरीके के रूप में क्या सलाह देंगे?

संपादित करें:

मैं वास्तव में पूरा आवेदन करने की आवश्यकता है। तो मैं इसे कुचलने और पुस्तकालय का उपयोग नहीं कर सकता। (उन लोगों के लिए जिन्हें नैतिक स्पष्टीकरण की आवश्यकता है: यह सीएडी सॉफ़्टवेयर का एक मालिकाना टुकड़ा है, जिसकी कंपनी वेबसाइट 2006 से अपडेट नहीं की गई है। मैंने इस उत्पाद के लिए भुगतान किया है (वास्तव में इसके लिए बहुत पैसा है, वास्तव में) और परियोजना है डेटा जो मैं आसानी से इससे दूर नहीं जा सकता। उत्पाद मुझे ठीक तरह से ठीक करता है, लेकिन मैं हाल ही में एक नया छिपाई का उपयोग करना चाहता हूं। मैंने एप्लिकेशन के आंतरिक जांच की है, और मैं काफी आत्मविश्वास में हूं कि मैं प्रासंगिक डेटा के साथ सही कार्य को कॉल कर सकता हूं और इसे ठीक से काम करने के लिए प्राप्त कर सकता हूं)।

यहां मैंने जो किया है, और यह काफी अच्छा है।

मैं पहले से ही इस प्रक्रिया के माध्यम आवेदन के कुछ हिस्सों संशोधित कर लिया है:

 
xxd -g 0 binary > binary.hex 
cat binary.hex | awk 'substitute work' > modified.hex 
xxd -r modified.hex > newbinary 
chmod 777 newbinary 

मैं हुप्स के माध्यम से कूद क्योंकि द्विआधारी लगभग 100 megs बड़ी है इस तरह का कर रहा हूँ।

जो मैं सोच रहा हूं उसका जस्ट यह है कि मैं मुख्य एप्लिकेशन लूप में कहीं भी jmp, एक थ्रेड लॉन्च करता हूं, और मुख्य फ़ंक्शन पर वापस आ जाता हूं।

अब, प्रश्न हैं: मैं नया कोड कहां डाल सकता हूं? क्या मुझे प्रतीक तालिकाओं को संशोधित करने की आवश्यकता है? वैकल्पिक रूप से, मैं स्वचालित रूप से एक डाइलीब लोड कैसे बना सकता हूं ताकि केवल "हैकिंग" मुझे सामान्य फ़ंक्शन में सामान्य रूप से लोड किए गए डाइलिब पर कॉल डालने की आवश्यकता हो?

उत्तर

0

दिलचस्प समस्या। अगर मैं आपको सही ढंग से समझता हूं, तो आप चल रहे निष्पादन योग्य में दूरस्थ रूप से कॉल करने की क्षमता जोड़ना चाहते हैं।

यदि आपको वास्तव में पूरे एप्लिकेशन की आवश्यकता नहीं है, तो आप मुख्य फ़ंक्शन को बाहर निकालने में सक्षम हो सकते हैं और उसे उस लाइब्रेरी फ़ाइल में बदल सकते हैं जिसके विरुद्ध आप लिंक कर सकते हैं। सभी आवश्यक प्रारंभिकरण सुनिश्चित करने के लिए यह सुनिश्चित करने के लिए आप पर निर्भर रहेंगे।

वायरस की तरह कार्य करने के लिए एक और दृष्टिकोण हो सकता है। रिमोट कॉल्स को संभालने वाले फ़ंक्शन को इंजेक्ट करें, शायद किसी अन्य थ्रेड में। आपको इस थ्रेड को मुख्य फ़ंक्शन में कुछ कोड इंजेक्ट करके लॉन्च करने की आवश्यकता होगी, या कहीं भी उचित है। सबसे अधिक संभावना है कि आप प्रारंभिकरण, थ्रेड सुरक्षा, और/या उचित कार्यक्रम स्थिति को बनाए रखने के साथ प्रमुख मुद्दों में भाग लेंगे।

सबसे अच्छा विकल्प, यदि यह उपलब्ध है, तो एक प्लगइन एपीआई का पर्दाफाश करने के लिए अपने आवेदन के विक्रेता को प्राप्त करना है जो आपको इसे सुरक्षित तरीके से सुरक्षित और भरोसेमंद तरीके से करने देता है।

यदि आप या तो हैक-द-बाइनरी मार्ग के साथ जाते हैं, तो यह समय लेने वाला और भंगुर होगा, लेकिन आप प्रक्रिया में बहुत कुछ सीखेंगे।

4

मैकोज़ एक्स में 10.5 से पहले रिलीज़ करता है आप इनपुट प्रबंधक एक्सटेंशन का उपयोग करके ऐसा करेंगे। इनपुट मैनेजर का उद्देश्य गैर-रोमन भाषाओं के लिए इनपुट जैसी चीज़ों को संभालने का था, जहां विस्तार उपयुक्त ग्लिफ इनपुट करने के लिए एक विंडो पॉप अप कर सकता था और फिर पूरा टेक्स्ट ऐप पर पास कर सकता था। आवेदन केवल यह सुनिश्चित करने के लिए आवश्यक था कि यह यूनिकोड-साफ़ था, और हर भाषा और क्षेत्र के सटीक विवरणों के बारे में चिंता करने की आवश्यकता नहीं थी।

इनपुट प्रबंधक को अनुप्रयोगों में असंबद्ध कार्यक्षमता के सभी प्रकारों को पैच करने के लिए जंगली दुर्व्यवहार किया गया था, और अक्सर ऐप को अस्थिर कर दिया गया था। यह "ओम्पा-लूमपा" जैसे ट्रोजन के लिए एक हमला वेक्टर भी बन रहा था। मैकोज़ 10.5 इनपुट मैनेजर्स पर प्रतिबंधों को मजबूत करता है: यह उन्हें रूट या व्हील के स्वामित्व वाली प्रक्रिया में नहीं चलाएगा, न ही उस प्रक्रिया में जिसने अपना यूआईडी संशोधित किया है। सबसे महत्वपूर्ण बात यह है कि 10.5 एक इनपुट प्रबंधक को 64 बिट प्रक्रिया में लोड नहीं करेगा और संकेत दिया है कि 32 बिट उपयोग भी असमर्थित है और भविष्य में रिलीज में हटा दिया जाएगा।

तो यदि आप प्रतिबंधों के साथ रह सकते हैं, तो इनपुट प्रबंधक जो भी आप चाहते हैं वह कर सकता है। भविष्य मैकोज़ रिलीज लगभग निश्चित रूप से ऐसा करने के लिए एक और (सुरक्षित, अधिक सीमित) तरीका पेश करेगा, क्योंकि कार्यक्षमता भाषा इनपुट समर्थन के लिए वास्तव में आवश्यक है।

मैं कई संभावनाएं देखा है:

+0

आप अर्थ रहे हैं कि मैं इतना है कि मैं TextInput सिस्टम के इंजेक्शन तरीकों freeload कर सकते हैं एक इनपुट प्रबंधक होने का नाटक करना चाहिए? प्रोग्राम कोको ऐप नहीं है, इसलिए मैं सोच रहा हूं कि मैं इनपुट इनपुटर भी लोड कर पाऊंगा। –

+0

यही मेरा मतलब था। हालांकि यदि कार्यक्रम कोको ऐप नहीं है, तो आप सही हैं कि आप इस तरह हुक नहीं डाल सकते हैं। ओह अच्छा। – DGentry

10

मैं क्या कर समाप्त हो गया गया है में रुचि रखने वालों के लिए, यहाँ एक सारांश है। वे रनटाइम पैचिंग, और स्थिर बाइनरी फ़ाइल पैचिंग में आते हैं।

  1. द्विआधारी की खंडों (__TEXT) कोड में विधानसभा को संशोधित:

    जहां तक ​​फ़ाइल पैचिंग का संबंध है, मैं अनिवार्य रूप से दो दृष्टिकोण की कोशिश की।

  2. मच हेडर में लोड कमांड को संशोधित करना।

पहली विधि के लिए खाली स्थान, या विधियों को ओवरराइट करने की आवश्यकता होती है। यह बेहद खराब रखरखाव से भी पीड़ित है। किसी भी नई बाइनरी को एक बार फिर हाथ पकड़ने की आवश्यकता होगी, खासकर यदि उनके स्रोत कोड में थोड़ा बदलाव आया है।

दूसरी विधि मशीन शीर्षलेख में LC_ LOAD_ DYLIB प्रविष्टि को आजमाने और जोड़ने का था। वहां कई मच-ओ संपादक नहीं हैं, इसलिए यह बालों वाली है, लेकिन मैंने वास्तव में संरचनाओं को संशोधित किया ताकि मेरी प्रविष्टि otool -l तक दिखाई दे। हालांकि, यह वास्तव में काम नहीं करता क्योंकि रनटाइम पर dyld: bad external relocation length था। मुझे लगता है कि मुझे आयात सारणी आदि के साथ चारों ओर घूमने की जरूरत है और यह एक संपादक के बिना सही पाने के लिए बहुत अधिक प्रयास है।

दूसरा पथ रनटाइम पर कोड इंजेक्ट करना था। ऐसा करने के लिए वहां बहुत कुछ नहीं है। यहां तक ​​कि उन ऐप्स के लिए जिन पर आपका नियंत्रण है (यानी आपके द्वारा लॉन्च किया गया एक बच्चा एप्लिकेशन)। शायद fork() का एक तरीका है और प्रारंभिक प्रक्रिया शुरू की गई है, लेकिन मैं कभी नहीं जाता हूं।

सिमबीएल है, लेकिन इसके लिए आपके ऐप को कोको होने की आवश्यकता है क्योंकि सिमबेल एक सिस्टम व्यापक इनपुट प्रबंधक के रूप में पेश करेगा और चुनिंदा लोड बंडल होगा। मैंने इसे खारिज कर दिया क्योंकि मेरा ऐप कोको नहीं था, और इसके अलावा, मैं सिस्टम की विस्तृत सामग्री को नापसंद करता हूं।

अगला अप mach_ इंजेक्ट और mach_star प्रोजेक्ट था।Google पर होस्ट किए गए प्लगसूट नामक एक नई परियोजना भी है जो mach_inject के चारों ओर एक पतली रैपर से अधिक कुछ नहीं प्रतीत होती है।

Mach_inject एक एपीआई प्रदान करता है जो नाम का तात्पर्य है। हालांकि मुझे कोड में कोई समस्या मिली। 10.5.4 पर, mach_inject.c फ़ाइल में mmap विधि को MAP_READ के साथ एक MAP_ साझा किया जाना चाहिए या फिर mmap विफल हो जाएगा।

इसके अलावा, पूरी चीज वास्तव में विज्ञापित के रूप में काम करती है। मैं mach_ inject_ बंडल का उपयोग करने के लिए समाप्त हुआ जो मैंने किया था कि मैंने एमई हेडर को डीवाईआईएलबी के स्थिर जोड़ के साथ क्या करना है: अर्थात् मॉड्यूल इनिट पर एक नया धागा लॉन्च करना जो इसके गंदे व्यवसाय करता है।

वैसे भी, मैंने इसे एक विकी बना दिया है। जानकारी जोड़ने, सही करने या अपडेट करने के लिए स्वतंत्र महसूस करें। ओएसएक्स पर इस तरह के काम पर व्यावहारिक रूप से कोई जानकारी उपलब्ध नहीं है। अधिक जानकारी, बेहतर।

+0

वहाँ जानकारी है http://rentzsch.com/papers/overridingMacOSX –

+0

^वह लिंक काम नहीं करता है: / – Chris

0

विंडोज़ पर, यह करना आसान है, वास्तव में बहुत व्यापक रूप से किया जाता है और इसे डीएलएल/कोड इंजेक्शन के रूप में जाना जाता है।

ओएसएक्स के लिए एक वाणिज्यिक एसडीके है जो यह करने की अनुमति देता है: Application Enhancer (गैर-वाणिज्यिक उपयोग के लिए नि: शुल्क)।

3

मेरा मानना ​​है कि आप DYLD_INSERT_LIBRARIES method का भी उपयोग कर सकते हैं।

This post जो भी आप करने की कोशिश कर रहे थे उससे भी संबंधित है;

1

मैंने हाल ही में mach_star स्रोतों का उपयोग करके इंजेक्शन/ओवरराइडिंग पर एक स्टैब लिया। मैंने इसके लिए एक ट्यूटोरियल लिखना समाप्त कर दिया क्योंकि इस सामान के लिए प्रलेखन हमेशा इतना स्केची और अक्सर पुराना होता है।

http://soundly.me/osx-injection-override-tutorial-hello-world/

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

  • कोई संबंधित समस्या नहीं^_^