macOS Dyld Process
मूल जानकारी
Mach-o बाइनरी का वास्तविक प्रवेश बिंदु डायनामिक लिंक किया जाता है, जो LC_LOAD_DYLINKER
में परिभाषित होता है और सामान्यत: /usr/lib/dyld
होता है।
यह लिंकर सभी क्रियान्वित पुस्तकालयों को ढूंढ़ने, मेमोरी में मैप करने और सभी गुदाजी पुस्तकालयों को लिंक करने की आवश्यकता होगी। इस प्रक्रिया के बाद ही, बाइनरी का प्रवेश-बिंदु कार्यान्वित होगा।
बेशक, dyld
किसी भी आवश्यकता का नहीं है (यह सिस्कॉल और libSystem उद्धरण का उपयोग करता है)।
यदि इस लिंकर में कोई भी सुरक्षा दोष होता है, क्योंकि यह किसी भी बाइनरी को कार्यान्वित करने से पहले (यहां तक कि उच्च विशेषाधिकार वाले भी) कार्यान्वित हो रहा है, तो विशेषाधिकारों को उन्नत करना संभव होगा।
प्रवाह
Dyld को dyldboostrap::start
द्वारा लोड किया जाएगा, जो चीजों को भी लोड करेगा जैसे स्टैक कैनरी। यह इसलिए है क्योंकि इस कार्य को इसके apple
तर्क सूची में इस और अन्य संवेदनशील मान मिलेंगे।
dyls::_main()
dyld का प्रवेश-बिंदु है और इसका पहला कार्य है configureProcessRestrictions()
चलाना, जो सामान्यत: DYLD_*
पर्यावरण मानों को प्रतिबंधित करता है जो निम्नलिखित में स्पष्ट किया गया है:
फिर, यह dyld साझा कैश को मैप करेगा जो सभी महत्वपूर्ण सिस्टम पुस्तकालयों को पूर्व-लिंक करता है और फिर यह बाइनरी पर निर्भर करता है और जब तक सभी आवश्यक पुस्तकालय लोड हो जाते हैं, जारी रहता है। इसलिए:
यह
DYLD_INSERT_LIBRARIES
के साथ डाली गई पुस्तकालयों को लोड करना शुरू करता है (यदि अनुमति है)फिर साझा कैश वाले
फिर आयातित वाले
फिर आगे आवश्यक पुस्तकालयों को आयात करना जारी रखें
एक बार जब सभी लोड हो जाते हैं, तो इन पुस्तकालयों के आरंभक चलाए जाते हैं। ये __attribute__((constructor))
का उपयोग करके कोड किए गए हैं जो LC_ROUTINES[_64]
में परिभाषित हैं (अब पुराने हो गए हैं) या S_MOD_INIT_FUNC_POINTERS
के साथ झंडीत किए गए खंड में पॉइंटर द्वारा।
अंतकर्ता __attribute__((destructor))
के साथ कोड किए गए हैं और एक खंड में स्थित हैं जिसे S_MOD_TERM_FUNC_POINTERS
झंडीत किया गया है (__DATA.__mod_term_func
).
स्टब्स
सभी macOS बाइनरी गतिशील रूप से लिंक होती हैं। इसलिए, वे विभिन्न मशीनों और संदर्भ में सही कोड पर जाने में मदद करने वाले कुछ स्टब्स खंड शामिल होते हैं। यह dyld है जो बाइनरी को निष्क्रिय नहीं करने वाले पतों को हल करने की आवश्यकता है (कम से कम गुदाजी वाले).
बाइनरी में कुछ स्टब्स खंड:
__TEXT.__[auth_]stubs
:__DATA
खंड से पॉइंटर__TEXT.__stub_helper
: डायनामिक लिंकिंग को आमंत्रित करने वाला छोटा कोड__DATA.__[auth_]got
: ग्लोबल ऑफसेट टेबल (आयातित फ़ंक्शनों के पतों के पते, जब वे हल होते हैं, (यह लोड समय के दौरान बाउंड होता है क्योंकि यह झंडीत है झंडीS_NON_LAZY_SYMBOL_POINTERS
के साथ`)__DATA.__nl_symbol_ptr
: नॉन-लेज़ी सिम्बल पॉइंटर (यह लोड समय के दौरान बाउंड होते हैं क्योंकि यह झंडीत है झंडीS_NON_LAZY_SYMBOL_POINTERS
के साथ`)__DATA.__la_symbol_ptr
: आलसी सिम्बल पॉइंटर (पहली पहुंच पर बाउंड होते हैं)
ध्यान दें कि "auth_" प्रीफ़िक्स के साथ पॉइंटर एक प्रक्रिया एन्क्रिप्शन कुंजी का उपयोग कर रहे हैं इसे सुरक्षित रखने के लिए (PAC)। इसके अलावा, यह संभावित है कि आर्म64 निर्देश BLRA[A/B]
का उपयोग करें पॉइंटर की पुष्टि करने से पहले। और RETA[A/B] का उपयोग एक RET पते के बजाय किया जा सकता है।
वास्तव में, __TEXT.__auth_stubs
में कोड bl
की बजाय braa
का उपयोग करेगा अनुरोधित फ़ंक्शन को आधारित करने के लिए।
इसके अलावा ध्यान दें कि वर्तमान dyld संस्करण सब कुछ गुदाजी के रूप में लोड करते हैं।
आलसी सिम्बल्स खोजें
रोचक डिसएसेम्बली भाग:
यह संभव है कि जंप करके printf को कॉल करने जा रहा है __TEXT.__stubs
:
जब __stubs
सेक्शन को disassemble किया जाता है:
आप देख सकते हैं कि हम GOT के पते पर जा रहे हैं, जो इस मामले में लेजी नहीं है और printf फ़ंक्शन का पता रखेगा।
अन्य स्थितियों में GOT पर सीधे जाने की बजाय, यह __DATA.__la_symbol_ptr
पर जा सकता है जो एक मान लोड करेगा जो फ़ंक्शन का प्रतिनिधित्व करता है जिसे यह लोड करने की कोशिश कर रहा है, फिर __TEXT.__stub_helper
पर जाएगा जो __DATA.__nl_symbol_ptr
पर जाएगा जिसमें dyld_stub_binder
का पता होता है जो फ़ंक्शन की संख्या और एक पते के रूप में पैरामीटर लेता है। यह अंतिम फ़ंक्शन, खोजी गई फ़ंक्शन के पते को ढूंढने के बाद उसे __TEXT.__stub_helper
में संबंधित स्थान में लिखता है ताकि भविष्य में लुकअप न करना पड़े।
हालांकि ध्यान दें कि वर्तमान dyld संस्करण सभी चीजें लोड करते हैं जैसा कि लेजी नहीं है।
Dyld ऑपकोड
अंततः, dyld_stub_binder
को निर्दिष्ट फ़ंक्शन को खोजने और उसे सही पते में लिखने की आवश्यकता है ताकि इसे फिर से खोजने की आवश्यकता न हो। इसे करने के लिए यह dyld के भीतर ऑपकोड (एक सीमित स्थिति मशीन) का उपयोग करता है।
apple[] argument vector
macOS में मुख्य फ़ंक्शन वास्तव में 3 के बजाय 4 प्रारूप में प्राप्त करता है। चौथा apple कहलाता है और प्रत्येक प्रविष्टि key=value
के रूप में है। उदाहरण के लिए:
macOS Dyld Process
macOS लाइब्रेरी इंजेक्शन
Dyld एक प्रक्रिया है जो macOS में लोड होने वाले सभी लाइब्रेरी को संभालता है। Dyld प्रक्रिया को अद्यतन करने के लिए एक अद्वितीय तरीका है जिसे लाइब्रेरी इंजेक्शन कहा जाता है। यह तकनीक प्रक्रिया में अनधिकृत लाइब्रेरी को डालने की अनुमति देती है, जिससे एक हमलावर अनुप्रयोग को नुकसान पहुंचा सकता है।
जब ये मान मुख्य फ़ंक्शन तक पहुँचते हैं, तो संवेदनशील जानकारी पहले से ही उनसे हटा दी गई होती है या फिर यह एक डेटा लीक हो सकता है।
मुख्य में पहुँचने से पहले इन दिलचस्प मानों को देखना संभव है डीबगिंग के साथ:
dyld_all_image_infos
यह एक संरचना है जो dyld द्वारा निर्यात की गई है जिसमें dyld की स्थिति के बारे में जानकारी होती है जो स्रोत कोड में पाई जा सकती है जैसे संस्करण, dyld_image_info एरे के लिए प्वाइंटर, dyld_image_notifier के लिए, यदि प्रोसेस साझा कैश से अलग है, यदि libSystem आरंभक को कॉल किया गया था, dyld के अपने Mach हेडर के लिए प्वाइंटर, dyld संस्करण स्ट्रिंग के प्वाइंटर...
dyld env variables
debug dyld
दिलचस्प एनवायरनमेंट वेरिएबल जो समझने में मदद करते हैं कि dyld क्या कर रहा है:
DYLD_PRINT_LIBRARIES
प्रत्येक लाइब्रेरी की जांच करें जो लोड हो रही है:
DYLD_PRINT_SEGMENTS
परीक्षण करें कि प्रत्येक पुस्तकालय कैसे लोड होती है:
DYLD_PRINT_INITIALIZERS
प्रिंट करें जब प्रत्येक लाइब्रेरी इनिशियलाइज़र चल रहा है:
अन्य
DYLD_BIND_AT_LAUNCH
: आलसी बाइंडिंग को गैर-आलसी के साथ हल किया जाता हैDYLD_DISABLE_PREFETCH
: __DATA और __LINKEDIT सामग्री का पूर्वाभिलेखन अक्षम करेंDYLD_FORCE_FLAT_NAMESPACE
: एक स्तरीय बाइंडिंगDYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH
: संकलन पथDYLD_INSERT_LIBRARIES
: एक विशिष्ट पुस्तकालय लोड करेंDYLD_PRINT_TO_FILE
: एक फ़ाइल में dyld डीबग लिखेंDYLD_PRINT_APIS
: libdyld API कॉल प्रिंट करेंDYLD_PRINT_APIS_APP
: मुख्य द्वारा किए गए libdyld API कॉल प्रिंट करेंDYLD_PRINT_BINDINGS
: बाइंड होने पर प्रतीक प्रिंट करेंDYLD_WEAK_BINDINGS
: बाइंड होने पर केवल कमजोर प्रतीक प्रिंट करेंDYLD_PRINT_CODE_SIGNATURES
: कोड हस्ताक्षर पंजीकरण कार्यों को प्रिंट करेंDYLD_PRINT_DOFS
: लोड होने पर D-ट्रेस ऑब्जेक्ट फ़ॉर्मेट खंड प्रिंट करेंDYLD_PRINT_ENV
: dyld द्वारा देखे गए env प्रिंट करेंDYLD_PRINT_INTERPOSTING
: इंटरपोस्टिंग कार्यों को प्रिंट करेंDYLD_PRINT_LIBRARIES
: लोड की गई पुस्तकालयें प्रिंट करेंDYLD_PRINT_OPTS
: लोड विकल्प प्रिंट करेंDYLD_REBASING
: प्रतीक रीबेसिंग कार्यों को प्रिंट करेंDYLD_RPATHS
: @rpath के विस्तार को प्रिंट करेंDYLD_PRINT_SEGMENTS
: Mach-O सेगमेंट के मैपिंग प्रिंट करेंDYLD_PRINT_STATISTICS
: समय सांख्यिकी प्रिंट करेंDYLD_PRINT_STATISTICS_DETAILS
: विस्तृत समय सांख्यिकी प्रिंट करेंDYLD_PRINT_WARNINGS
: चेतावनी संदेश प्रिंट करेंDYLD_SHARED_CACHE_DIR
: साझा पुस्तकालय कैश के लिए पथDYLD_SHARED_REGION
: "उपयोग", "निजी", "टालें"DYLD_USE_CLOSURES
: बंद करने की अनुमति दें
ऐसा कुछ और भी ढूंढना संभव है:
या dyld परियोजना को https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz से डाउनलोड करके फ़ोल्डर के अंदर चला सकते हैं:
संदर्भ
Last updated