2008-11-07 12 views
7

में एलसी_LOAD_DYLIB कमांड को कैसे सम्मिलित करें मैं कुछ कोड के साथ त्याग करने का एक टुकड़ा पैच करना चाहता हूं।एक मैक-ओ बाइनरी (ओएसएक्स)

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

मैंने उचित लोड कमांड (एलसी_ LOAD_DYLIB) जोड़ने के लिए हेक्सेडिटर का उपयोग करके मच-हे हेडर के साथ चारों ओर उलझा दिया है।

ओटोल रिपोर्ट करता है कि मैं क्या देखने की उम्मीद करता हूं, इसलिए मुझे पूरा विश्वास है कि फ़ाइल सही ढंग से स्वरूपित है।

 
Load command 63 
      cmd LC_LOAD_DYLIB 
     cmdsize 60 
     name @executable_path/libAltInput.dylib (offset 24) 
    time stamp 1183743291 Fri Jul 6 19:34:51 2007 
     current version 0.0.0 
compatibility version 0.0.0 

हालांकि, द्विआधारी शुरू करने के लिए मुझे निम्न त्रुटि

 
dyld: bad external relocation length 

सभी मैं इसका मतलब यह है अनुमान लगा सकते हैं कि मैं LC_ SYMTAB या LC_ DYNSYMTAB वर्गों संशोधित करने की आवश्यकता है देता है ...

क्या किसी के भी पास कोई सुझाव है?

उत्तर

4

मुझे पूरा यकीन नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं, लेकिन ऐसा करने का सबसे आसान तरीका यह है कि यह शुरू होने के बाद मच कार्य में एक थ्रेड इंजेक्ट करना है। ऐसा करने के बारे में जानकारी का एक बड़ा स्रोत (साथ ही इसे करने के लिए कोड चलाना) यहां पाया जा सकता है: http://rentzsch.com/mach_inject/

कुछ चेतावनियां है कि आप के बारे में पता होना चाहिए:

  1. मच task_for_pid() कार्य करने के लिए मच बंदरगाह प्राप्त करने के लिए आवश्यक फोन अब privleged और कॉल करने के लिए प्राधिकरण की आवश्यकता है है। इसका कारण बहुत स्पष्ट है लेकिन यदि आप इंजेक्शन कोड के साथ कुछ जारी करने की योजना बना रहे थे, तो आपको इसके बारे में पता होना चाहिए।
  2. आपका कोड मूल प्रक्रिया के रूप में एक ही प्रक्रिया स्थान पर चल रहा है लेकिन एक अलग धागे पर। इसलिए, आपके पास एप्लिकेशन तक पूर्ण पहुंच होगी, हालांकि, यदि यह थ्रेड-जागरूक नहीं है, तो अपने इंजेक्शन कोड के बाहर से डेटा का उपयोग और छेड़छाड़ करने के बारे में बहुत सावधान रहें। जाहिर है कि सभी बहुप्रचारित मुद्दों को यहां बढ़ाया जाएगा क्योंकि मूल कोड आपके जोड़ों के बारे में कभी भी अवगत नहीं था।
+0

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

+0

हाँ, मैंने बस अपना अन्य प्रश्न पढ़ा है ... mach_inject शायद आपकी सबसे अच्छी, सबसे आसान शर्त है। –

2

द्विआधारी पैचिंग शामिल करने वाला सबसे आसान समाधान केवल DYLD_INSERT_LIBRARIES पर्यावरण चर का उपयोग करना है और फिर अपना एप्लिकेशन चलाएं।

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib 

मैं कारण गतिशील लिंकर एक त्रुटि रिपोर्ट संभालने कर रहा हूँ है, क्योंकि मच-ओ फ़ाइल स्वरूप में कई क्षेत्रों एक फ़ाइल की शुरुआत से ऑफसेट के रूप में निर्दिष्ट पतों में तो एक और बोझ आदेश जोड़ने हर अमान्य हैं पता। उदाहरण के लिए, Mac OS X ABI Mach-O File Format Reference में symoff और stroff प्रविष्टियां देखें।