macOS IOKit
Basic Information
I/O Kit एक ओपन-सोर्स, ऑब्जेक्ट-ओरिएंटेड डिवाइस-ड्राइवर ढांचा है जो XNU कर्नेल में है, जो गतिशील रूप से लोड किए गए डिवाइस ड्राइवरों को संभालता है। यह कर्नेल में ऑन-द-फ्लाई मॉड्यूलर कोड जोड़ने की अनुमति देता है, जो विविध हार्डवेयर का समर्थन करता है।
IOKit ड्राइवर मूल रूप से कर्नेल से फ़ंक्शन निर्यात करेंगे। इन फ़ंक्शन पैरामीटर प्रकारों को पूर्व-परिभाषित किया गया है और इन्हें सत्यापित किया गया है। इसके अलावा, XPC के समान, IOKit Mach संदेशों के ऊपर एक और परत है।
IOKit XNU कर्नेल कोड को Apple द्वारा https://github.com/apple-oss-distributions/xnu/tree/main/iokit में ओपन-सोर्स किया गया है। इसके अलावा, उपयोगकर्ता स्थान IOKit घटक भी ओपन-सोर्स हैं https://github.com/opensource-apple/IOKitUser।
हालांकि, कोई IOKit ड्राइवर ओपन-सोर्स नहीं हैं। फिर भी, समय-समय पर एक ड्राइवर का रिलीज़ ऐसे प्रतीकों के साथ आ सकता है जो इसे डिबग करना आसान बनाते हैं। यहाँ देखें कि फर्मवेयर से ड्राइवर एक्सटेंशन कैसे प्राप्त करें।
यह C++ में लिखा गया है। आप demangled C++ प्रतीकों को प्राप्त कर सकते हैं:
IOKit प्रकट की गई फ़ंक्शन अतिरिक्त सुरक्षा जांच कर सकते हैं जब एक क्लाइंट किसी फ़ंक्शन को कॉल करने की कोशिश करता है, लेकिन ध्यान दें कि ऐप्स आमतौर पर सीमित होते हैं उस सैंडबॉक्स द्वारा जिसमें वे IOKit फ़ंक्शनों के साथ इंटरैक्ट कर सकते हैं।
ड्राइवर
macOS में ये निम्नलिखित स्थानों पर होते हैं:
/System/Library/Extensions
KEXT फ़ाइलें जो OS X ऑपरेटिंग सिस्टम में निर्मित होती हैं।
/Library/Extensions
KEXT फ़ाइलें जो 3rd पार्टी सॉफ़्टवेयर द्वारा स्थापित की जाती हैं।
iOS में ये निम्नलिखित स्थानों पर होते हैं:
/System/Library/Extensions
9 तक सूचीबद्ध ड्राइवर पता 0 में लोड होते हैं। इसका मतलब है कि वे असली ड्राइवर नहीं हैं बल्कि कर्नेल का हिस्सा हैं और उन्हें अनलोड नहीं किया जा सकता।
विशिष्ट एक्सटेंशन खोजने के लिए आप उपयोग कर सकते हैं:
कर्नेल एक्सटेंशन लोड और अनलोड करने के लिए करें:
IORegistry
IORegistry macOS और iOS में IOKit ढांचे का एक महत्वपूर्ण हिस्सा है जो सिस्टम की हार्डवेयर कॉन्फ़िगरेशन और स्थिति का प्रतिनिधित्व करने के लिए एक डेटाबेस के रूप में कार्य करता है। यह वस्तुओं का एक पदानुक्रमित संग्रह है जो सिस्टम पर लोड किए गए सभी हार्डवेयर और ड्राइवरों का प्रतिनिधित्व करता है, और उनके बीच के संबंधों को दर्शाता है।
आप CLI ioreg
का उपयोग करके IORegistry प्राप्त कर सकते हैं ताकि इसे कंसोल से निरीक्षण किया जा सके (विशेष रूप से iOS के लिए उपयोगी)।
आप IORegistryExplorer
को Xcode Additional Tools से https://developer.apple.com/download/all/ से डाउनलोड कर सकते हैं और macOS IORegistry का निरीक्षण ग्राफिकल इंटरफेस के माध्यम से कर सकते हैं।
IORegistryExplorer में, "planes" का उपयोग IORegistry में विभिन्न वस्तुओं के बीच संबंधों को व्यवस्थित और प्रदर्शित करने के लिए किया जाता है। प्रत्येक plane एक विशिष्ट प्रकार के संबंध या सिस्टम के हार्डवेयर और ड्राइवर कॉन्फ़िगरेशन का एक विशेष दृश्य दर्शाता है। यहाँ कुछ सामान्य planes हैं जिनका आप IORegistryExplorer में सामना कर सकते हैं:
IOService Plane: यह सबसे सामान्य plane है, जो सेवा वस्तुओं को प्रदर्शित करता है जो ड्राइवरों और नब्स (ड्राइवरों के बीच संचार चैनल) का प्रतिनिधित्व करते हैं। यह इन वस्तुओं के बीच प्रदाता-ग्राहक संबंधों को दिखाता है।
IODeviceTree Plane: यह plane उन उपकरणों के बीच भौतिक कनेक्शनों का प्रतिनिधित्व करता है जब वे सिस्टम से जुड़े होते हैं। इसका उपयोग अक्सर USB या PCI जैसे बसों के माध्यम से जुड़े उपकरणों की पदानुक्रम को दृश्य बनाने के लिए किया जाता है।
IOPower Plane: यह पावर प्रबंधन के संदर्भ में वस्तुओं और उनके संबंधों को प्रदर्शित करता है। यह दिखा सकता है कि कौन सी वस्तुएं दूसरों की पावर स्थिति को प्रभावित कर रही हैं, जो पावर से संबंधित समस्याओं को डिबग करने के लिए उपयोगी है।
IOUSB Plane: विशेष रूप से USB उपकरणों और उनके संबंधों पर केंद्रित, USB हब और जुड़े उपकरणों की पदानुक्रम को दिखाता है।
IOAudio Plane: यह plane ऑडियो उपकरणों और उनके संबंधों का प्रतिनिधित्व करने के लिए है।
...
Driver Comm Code Example
निम्नलिखित कोड IOKit सेवा "YourServiceNameHere"
से कनेक्ट करता है और चयनकर्ता 0 के अंदर फ़ंक्शन को कॉल करता है। इसके लिए:
यह पहले
IOServiceMatching
औरIOServiceGetMatchingServices
को कॉल करता है ताकि सेवा प्राप्त की जा सके।फिर यह
IOServiceOpen
को कॉल करके एक कनेक्शन स्थापित करता है।और अंत में यह
IOConnectCallScalarMethod
के साथ एक फ़ंक्शन को कॉल करता है जो चयनकर्ता 0 को इंगित करता है (चयनकर्ता वह संख्या है जो फ़ंक्शन को कॉल करने के लिए असाइन की गई है)।
There are other functions that can be used to call IOKit functions apart of IOConnectCallScalarMethod
like IOConnectCallMethod
, IOConnectCallStructMethod
...
ड्राइवर एंट्रीपॉइंट को रिवर्स करना
आप इन्हें उदाहरण के लिए फर्मवेयर इमेज (ipsw) से प्राप्त कर सकते हैं। फिर, इसे अपने पसंदीदा डिकंपाइलर में लोड करें।
आप externalMethod
फ़ंक्शन को डिकंपाइल करना शुरू कर सकते हैं क्योंकि यह वह ड्राइवर फ़ंक्शन है जो कॉल प्राप्त करेगा और सही फ़ंक्शन को कॉल करेगा:
That awful call demagled means:
ध्यान दें कि पिछले परिभाषा में self
पैरामीटर गायब है, सही परिभाषा होगी:
वास्तव में, आप असली परिभाषा https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388 पर पा सकते हैं:
इस जानकारी के साथ आप Ctrl+Right -> Edit function signature
को फिर से लिख सकते हैं और ज्ञात प्रकार सेट कर सकते हैं:
नया डिकंपाइल किया गया कोड इस तरह दिखेगा:
अगले चरण के लिए हमें IOExternalMethodDispatch2022
संरचना को परिभाषित करना होगा। यह https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176 में ओपन-सोर्स है, आप इसे परिभाषित कर सकते हैं:
अब, (IOExternalMethodDispatch2022 *)&sIOExternalMethodArray
के बाद आप बहुत सारे डेटा देख सकते हैं:
डेटा प्रकार को IOExternalMethodDispatch2022:
में बदलें:
बदलाव के बाद:
और जैसा कि हम अब वहां हैं, हमारे पास 7 तत्वों का एक एरे है (अंतिम डिकंपाइल किए गए कोड की जांच करें), 7 तत्वों का एक एरे बनाने के लिए क्लिक करें:
एरे बनने के बाद आप सभी निर्यातित कार्यों को देख सकते हैं:
यदि आप याद रखें, तो उपयोगकर्ता स्थान से एक निर्यातित कार्य को call करने के लिए हमें कार्य का नाम कॉल करने की आवश्यकता नहीं है, बल्कि selector number की आवश्यकता है। यहां आप देख सकते हैं कि selector 0 कार्य initializeDecoder
है, selector 1 startDecoder
है, selector 2 initializeEncoder
है...
Last updated