macOS IPC - Inter Process Communication
पोर्ट के माध्यम से Mach संदेश
मौलिक जानकारी
Mach कार्यों का उपयोग संसाधन साझा करने के लिए सबसे छोटी इकाई के रूप में करता है, और प्रत्येक कार्य में कई धागे हो सकते हैं। ये कार्य और धागे 1:1 मैप किए गए हैं POSIX प्रक्रियाओं और धागों के साथ।
कार्यों के बीच संचार Mach इंटर-प्रोसेस कम्यूनिकेशन (IPC) के माध्यम से होता है, जो एक-तरफा संचार चैनल का उपयोग करता है। संदेश पोर्टों के बीच स्थानांतरित किए जाते हैं, जो कर्नेल द्वारा प्रबंधित संदेश कतारों की तरह कार्य करते हैं।
पोर्ट Mach IPC का मौलिक तत्व है। इसका उपयोग संदेश भेजने और प्राप्त करने के लिए किया जा सकता है।
प्रत्येक प्रक्रिया के पास एक IPC तालिका होती है, जिसमें प्रक्रिया के mach पोर्ट मिल सकते हैं। मैच पोर्ट का नाम वास्तव में एक संख्या है (कर्नेल ऑब्जेक्ट के लिए एक पॉइंटर)।
एक प्रक्रिया एक पोर्ट नाम को कुछ अधिकारों के साथ एक विभिन्न कार्य को भेज सकती है और कर्नेल इसे दूसरे कार्य की IPC तालिका में इस प्रविष्टि को दिखाएगा।
पोर्ट अधिकार
पोर्ट अधिकार, जो यह निर्धारित करते हैं कि एक कार्य किस कार्रवाई कर सकता है, इस संचार के लिए महत्वपूर्ण हैं। संभावित पोर्ट अधिकार हैं (यहाँ से परिभाषाएँ):
प्राप्ति अधिकार, जो पोर्ट को भेजे गए संदेश प्राप्त करने की अनुमति देता है। Mach पोर्ट MPSC (एकाधिक उत्पादक, एकल-उपभोक्ता) कतारें हैं, जिसका मतलब है कि पूरे सिस्टम में हर पोर्ट के लिए केवल एक प्राप्ति अधिकार हो सकता है (जैसे कि पाइप्स में, जहां कई प्रक्रियाएं सभी एक पाइप के पढ़ने के लिए फ़ाइल डिस्क्रिप्टर्स को धारण कर सकती हैं)।
प्राप्ति अधिकार वाला एक कार्य संदेश प्राप्त कर सकता है और भेजने के अधिकार बना सकता है, जिससे उसे संदेश भेजने की अनुमति मिलती है। मूल रूप से केवल अपने कार्य के पास अपने पोर्ट पर प्राप्ति अधिकार होता है।
अगर प्राप्ति अधिकार का मालिक मर जाता है या उसे मार देता है, तो भेजने का अधिकार अनर्थक (मरा नाम) हो जाता है।
भेजने का अधिकार, जो पोर्ट को संदेश भेजने की अनुमति देता है।
भेजने का अधिकार क्लोन किया जा सकता है ताकि भेजने का अधिकार रखने वाला एक कार्य अधिकार को क्लोन कर सके और इसे तीसरे कार्य को प्रदान कर सके।
ध्यान दें कि पोर्ट अधिकार Mac संदेश के माध्यम से भी पारित किए जा सकते हैं।
एक बार भेजने का अधिकार, जो पोर्ट को एक संदेश भेजने की अनुमति देता है और फिर गायब हो जाता है।
यह अधिकार क्लोन नहीं किया जा सकता है, लेकिन इसे हटाया जा सकता है।
पोर्ट सेट अधिकार, जो एक पोर्ट सेट को दर्शाता है बल्कि एक एकल पोर्ट। पोर्ट सेट से संदेश को डीक्यू करने से यह उसमें शामिल पोर्टों में से एक से संदेश को डीक्यू करता है। पोर्ट सेट का उपयोग कई पोर्टों पर सुनने के लिए किया जा सकता है, Unix में
select
/poll
/epoll
/kqueue
की तरह।मरा नाम, जो वास्तव में एक पोर्ट अधिकार नहीं है, बल्कि केवल एक प्लेसहोल्डर है। जब एक पोर्ट नष्ट होता है, तो पोर्ट के सभी मौजूदा पोर्ट अधिकार मरे नाम में बदल जाते हैं।
कार्य SEND अधिकार को दूसरों को स्थानांतरित कर सकते हैं, जिससे उन्हें संदेश वापस भेजने की अनुमति मिलती है। SEND अधिकार को क्लोन भी किया जा सकता है, इसलिए एक कार्य एक अधिकार को डुप्लिकेट कर सकता है और इसे तीसरे कार्य को दे सकता है। इसके साथ, एक मध्यस्थ प्रक्रिया जिसे बूटस्ट्रैप सर्वर के रूप में जाना जाता है, कार्यों के बीच प्रभावी संचार की अनुमति देता है।
फाइल पोर्ट
फाइल पोर्ट फाइल डिस्क्रिप्टर्स को Mac पोर्ट में बंधने की अनुमति देते हैं (Mach पोर्ट अधिकार का उपयोग करके)। fileport_makeport
का उपयोग करके दिए गए FD से fileport
बनाना संभव है और fileport_makefd
का उपयोग करके फाइलपोर्ट से एक FD बनाना संभव है।
संचार स्थापित करना
पहले से किसी अधिकार के बिना एक अधिकार भेजना संभव नहीं है, इसलिए, पहली संचार कैसे स्थापित की जाती है?
इसके लिए, बूटस्ट्रैप सर्वर (मैक में लॉन्चडी है) शामिल है, क्योंकि हर कोई बूटस्ट्रैप सर्वर को भेजने का अधिकार प्राप्त कर सकता है, इसलिए इससे किसी अन्य प्रक्रिया को संदेश भेजने के लिए अधिकार मांग सकते हैं:
कार्य A एक नया पोर्ट बनाता है, जिसे उसके पास प्राप्ति अधिकार होता है।
कार्य A, प्राप्ति अधिकार के धारक होने के नाते, पोर्ट के लिए भेजने का अधिकार उत्पन्न करता है।
कार्य A बूट
एक Mach संदेश
mach_msg
फ़ंक्शन, मुख्य रूप से एक सिस्टम कॉल है, Mach संदेश भेजने और प्राप्त करने के लिए उपयोग किया जाता है। इस फ़ंक्शन को संदेश को पहले तर्क के रूप में भेजा जाना चाहिए। इस संदेश को mach_msg_header_t
संरचना से आरंभ करना चाहिए, जिसके बाद वास्तविक संदेश सामग्री होती है। संरचना निम्नलिखित रूप में परिभाषित की जाती है:
प्रक्रियाएँ जिनके पास एक प्राप्ति अधिकार हैं, वे Mach पोर्ट पर संदेश प्राप्त कर सकती हैं। उल्टे, भेजने वाले को एक भेजने या एक बार भेजने का अधिकार प्रदान किया जाता है। एक बार भेजने का अधिकार केवल एक संदेश भेजने के लिए है, उसके बाद यह अमान्य हो जाता है।
प्रारंभिक फ़ील्ड msgh_bits
एक बिटमैप है:
पहला बिट (सबसे महत्वपूर्ण) यह दर्शाता है कि एक संदेश जटिल है (इसके बारे में नीचे अधिक)
तीसरा और चौथा कर्नेल द्वारा उपयोग किया जाता है
दूसरे बाइट के 5 सबसे कम महत्वपूर्ण बिट का उपयोग वाउचर के लिए किया जा सकता है: एक और प्रकार का पोर्ट कुंजी/मान संयोजन भेजने के लिए।
तीसरे बाइट के 5 सबसे कम महत्वपूर्ण बिट का उपयोग स्थानीय पोर्ट के लिए किया जा सकता है
चौथे बाइट के 5 सबसे कम महत्वपूर्ण बिट का उपयोग दूरस्थ पोर्ट के लिए किया जा सकता है
वाउचर, स्थानीय और दूरस्थ पोर्ट में निर्दिष्ट किए जा सकने वाले प्रकार हैं (से mach/message.h):
उदाहरण के लिए, MACH_MSG_TYPE_MAKE_SEND_ONCE
का उपयोग सूचित करने के लिए किया जा सकता है कि इस पोर्ट के लिए एक एक-बार-भेजें अधिकार को उत्पन्न और स्थानांतरित किया जाना चाहिए। इसे MACH_PORT_NULL
को निर्दिष्ट किया जा सकता है ताकि प्राप्तकर्ता को जवाब देने की क्षमता न हो।
एक सरल द्विदिशीय संचार प्राप्त करने के लिए एक प्रक्रिया मशीन संदेश हेडर में एक उत्तर पोर्ट (msgh_local_port
) निर्दिष्ट कर सकती है जहां संदेश का प्राप्तकर्ता इस संदेश का उत्तर भेज सकता है।
ध्यान दें कि इस प्रकार के द्विदिशीय संचार का उपयोग एक्सपीसी संदेशों में किया जाता है जो एक प्रतिक्रिया की उम्मीद रखते हैं (xpc_connection_send_message_with_reply
और xpc_connection_send_message_with_reply_sync
)। लेकिन आम तौर पर विभिन्न पोर्ट बनाए जाते हैं जैसा पहले स्पष्ट किया गया है ताकि द्विदिशीय संचार बनाया जा सके।
संदेश हेडर के अन्य फ़ील्ड हैं:
msgh_size
: पूरे पैकेट का आकार।msgh_remote_port
: जिस पोर्ट पर यह संदेश भेजा गया है।msgh_voucher_port
: मश वाउचर।msgh_id
: इस संदेश का आईडी, जिसे प्राप्तकर्ता द्वारा व्याख्या किया जाता है।
ध्यान दें कि मश संदेश एक मश पोर्ट
के माध्यम से भेजे जाते हैं, जो मश कर्नल में बनाया गया एक एकल प्राप्तकर्ता, एकाधिक भेजने वाला संचार चैनल है। एकाधिक प्रक्रियाएँ एक मश पोर्ट को संदेश भेज सकती हैं, लेकिन किसी भी समय केवल एक प्रक्रिया इसे पढ़ सकती है।
उसके बाद संदेश mach_msg_header_t
हेडर द्वारा और बॉडी द्वारा और ट्रेलर (यदि कोई) द्वारा बनाए जाते हैं और इसे उत्तर देने की अनुमति दे सकते हैं। इन मामलों में, कर्नल को सिर्फ एक कार्य से दूसरे कार्य तक संदेश पारित करने की आवश्यकता होती है।
एक ट्रेलर एक संदेश में कर्नल द्वारा जोड़ी गई जानकारी है (उपयोगकर्ता द्वारा सेट नहीं की जा सकती) जिसे संदेश प्राप्ति में फ्लैग MACH_RCV_TRAILER_<trailer_opt>
के साथ अनुरोध किया जा सकता है (यहां विभिन्न जानकारी अनुरोध की जा सकती है)।
जटिल संदेश
हालांकि, अन्य अधिक जटिल संदेश हैं, जैसे अतिरिक्त पोर्ट अधिकार या साझा मेमोरी पास करने वाले, जहां कर्नल को भी इन वस्तुओं को प्राप्तकर्ता को भेजने की आवश्यकता होती है। इस मामले में हेडर msgh_bits
का सबसे महत्वपूर्ण बिट सेट किया जाता है।
पारित करने के लिए संभावित वर्णन mach/message.h
में परिभाषित हैं:
Mac Ports APIs
नोट करें कि पोर्ट्स को टास्क नेमस्पेस से जुड़ा होता है, इसलिए पोर्ट बनाने या खोजने के लिए, टास्क नेमस्पेस भी क्वेरी किया जाता है (अधिक जानकारी mach/mach_port.h
में):
mach_port_allocate
|mach_port_construct
: एक पोर्ट बनाएं।mach_port_allocate
एक पोर्ट सेट भी बना सकता है: एक समूह के पोर्ट्स पर प्राप्ति अधिकार। जब भी एक संदेश प्राप्त होता है, तो इसमें संकेतित किया जाता है कि संदेश किस पोर्ट से आया था।mach_port_allocate_name
: पोर्ट का नाम बदलें (डिफ़ॉल्ट रूप से 32 बिट पूर्णांक)mach_port_names
: एक लक्ष्य से पोर्ट नाम प्राप्त करेंmach_port_type
: एक नाम पर टास्क के अधिकार प्राप्त करेंmach_port_rename
: एक पोर्ट का नाम बदलें (जैसे FDs के लिए dup2)mach_port_allocate
: एक नया प्राप्ति, पोर्ट सेट या DEAD_NAME आवंटित करेंmach_port_insert_right
: उस पोर्ट में एक नया अधिकार बनाएं जिस पर आपके पास प्राप्ति हैmach_port_...
mach_msg
|mach_msg_overwrite
: mach संदेश भेजने और प्राप्त करने के लिए उपयोग किए जाने वाले फ़ंक्शन। ओवरराइट संस्करण एक विभिन्न बफ़र को संदेश प्राप्ति के लिए निर्दिष्ट करने की अनुमति देता है (दूसरा संस्करण इसे बस पुनः उपयोग करेगा)।
Debug mach_msg
जैसे ही फ़ंक्शन mach_msg
और mach_msg_overwrite
को संदेश भेजने और प्राप्त करने के लिए उपयोग किया जाता है, उन पर ब्रेकपॉइंट सेट करने से भेजे गए और प्राप्त किए गए संदेशों की जांच की जा सकती है।
उदाहरण के लिए किसी भी एप्लिकेशन को डीबग करना शुरू करें जिसे आप डीबग कर सकते हैं क्योंकि यह libSystem.B
लोड करेगा जो इस फ़ंक्शन का उपयोग करेगा।
विनिर्देशिकाओं से मान प्राप्त करें:
मैसेज हेडर की जांच करें और पहले आर्ग्यूमेंट की जांच करें:
ऐसे प्रकार का mach_msg_bits_t
एक उत्तर की अनुमति देने के लिए बहुत सामान्य है।
द्वारों की गणना
नाम पोर्ट का डिफ़ॉल्ट नाम है (जांचें कि पहले 3 बाइट में कैसे बढ़ रहा है)। ipc-object
पोर्ट की अविवादित अद्वितीय पहचानकर्ता है। ध्यान दें कि केवल send
अधिकार वाले पोर्ट के स्वामी की पहचान कैसे की जा रही है (पोर्ट नाम + pid)। यहाँ ध्यान दें कि +
का उपयोग उसी पोर्ट से जुड़े अन्य कार्यों को दर्शाने के लिए किया जा रहा है।
procesxp का उपयोग करके भी पंजीकृत सेवा नामों (SIP अक्षम होने के कारण com.apple.system-task-port
की आवश्यकता होने पर) देखना संभव है:
आप इस टूल को iOS में इंस्टॉल कर सकते हैं इसे http://newosxbook.com/tools/binpack64-256.tar.gz से डाउनलोड करके।
कोड उदाहरण
नोट करें कि भेजने वाला एक पोर्ट आवंटित करता है, org.darlinghq.example
नाम के लिए एक भेजने का हक बनाता है और इसे बूटस्ट्रैप सर्वर को भेजता है जबकि भेजने वाला उस नाम के भेजने का हक के लिए अनुरोध करता है और इसका उपयोग संदेश भेजने के लिए करता है।
विशेष बंदरगाह
कुछ विशेष बंदरगाह हैं जो किसी कार्यों को कुछ संवेदनशील कार्रवाई करने या कुछ संवेदनशील डेटा तक पहुंचने की अनुमति देते हैं यदि उन पर SEND अनुमतियाँ हो। इससे इन बंदरगाहों को हमलावर की दृष्टि से बहुत दिलचस्प बनाता है न केवल क्षमताओं के कारण बल्कि इसलिए क्योंकि कार्यों के बीच SEND अनुमतियों को साझा किया जा सकता है।
मेजबान विशेष बंदरगाह
ये बंदरगाह एक संख्या द्वारा प्रतिनिधित किए जाते हैं।
SEND अधिकार प्राप्त करने के लिए host_get_special_port
को बुलाकर और RECEIVE अधिकारों को बुलाकर host_set_special_port
को बुलाकर प्राप्त किया जा सकता है। हालांकि, दोनों कॉल्स को host_priv
बंदरगाह की आवश्यकता है जिसको केवल रूट तक पहुंच होती है। इसके अतिरिक्त, पिछले में रूट को host_set_special_port
बुलाने और अवशेष को हाइजैक करने की अनुमति थी जिससे कोड हस्ताक्षरों को उलटा सकता था जैसे HOST_KEXTD_PORT
को हाइजैक करके (SIP अब इसे रोकता है)।
ये 2 समूहों में विभाजित हैं: पहले 7 बंदरगाह कर्नेल के स्वामित्व में हैं जिसमें 1 HOST_PORT
, 2 HOST_PRIV_PORT
, 3 HOST_IO_MASTER_PORT
और 7 HOST_MAX_SPECIAL_KERNEL_PORT
हैं।
8 से शुरू होने वाले वे सिस्टम डेमन्स के स्वामित्व में हैं और उन्हें host_special_ports.h
में घोषित किया जा सकता है।
मेजबान बंदरगाह: यदि किसी प्रक्रिया के पास इस बंदरगाह पर SEND विशेषाधिकार हैं तो वह इसके रूटीन को बुलाकर सिस्टम के बारे में जानकारी प्राप्त कर सकती है जैसे:
host_processor_info
: प्रोसेसर जानकारी प्राप्त करेंhost_info
: मेजबान जानकारी प्राप्त करेंhost_virtual_physical_table_info
: वर्चुअल/फिजिकल पेज टेबल (MACH_VMDEBUG की आवश्यकता है)host_statistics
: मेजबान सांख्यिकी प्राप्त करेंmach_memory_info
: कर्नेल मेमोरी लेआउट प्राप्त करेंमेजबान निजी बंदरगाह: इस बंदरगाह पर SEND अधिकार वाली प्रक्रिया विशेषाधिकारी कार्रवाई कर सकती है जैसे बूट डेटा दिखाना या कर्नेल एक्सटेंशन लोड करने का प्रयास करना। प्रक्रिया को रूट होना चाहिए इस अनुमति को प्राप्त करने के लिए।
इसके अतिरिक्त,
kext_request
API को बुलाने के लिए अन्य entitlementscom.apple.private.kext*
की आवश्यकता है जो केवल Apple binaries को दिया जाता है।अन्य रूटीन जो बुलाए जा सकते हैं:
host_get_boot_info
:machine_boot_info()
प्राप्त करेंhost_priv_statistics
: विशेषाधिकारी सांख्यिकी प्राप्त करेंvm_allocate_cpm
: एकसंघटित फिजिकल मेमोरी आवंटित करेंhost_processors
: मेजबान प्रोसेसर्स को भेजेंmach_vm_wire
: मेमोरी को रहने वाला बनाएंक्योंकि रूट इस अनुमति तक पहुंच सकता है, यह हो सकता है कि वह
host_set_[special/exception]_port[s]
को बुलाकर मेजबान विशेष या अवशेष बंदरगाहों को हाइजैक करें।
इन सभी मेजबान विशेष बंदरगाहों को देखना संभव है द्वारा चलाकर:
कार्य विशेष पोर्ट
ये पोर्ट विशेष सेवाओं के लिए आरक्षित हैं। इन्हें task_[get/set]_special_port
को बुलाकर प्राप्त/सेट किया जा सकता है। इन्हें task_special_ports.h
में पाया जा सकता है:
From here:
TASK_KERNEL_PORT[task-self send right]: यह पोर्ट इस टास्क को नियंत्रित करने के लिए उपयोग किया जाता है। इस्तेमाल किया जाता है मैसेजेस भेजने के लिए जो इस टास्क को प्रभावित करते हैं। यह पोर्ट mach_task_self (नीचे देखें Task Ports) द्वारा वापस किया जाता है।
TASK_BOOTSTRAP_PORT[bootstrap send right]: टास्क का bootstrap पोर्ट। इस्तेमाल किया जाता है अन्य सिस्टम सेवा पोर्ट की वापसी के लिए मैसेजेस भेजने के लिए।
TASK_HOST_NAME_PORT[host-self send right]: इसमें आवासी आवाज की जानकारी का अनुरोध करने के लिए उपयोग किया जाता है। यह पोर्ट mach_host_self द्वारा वापस किया जाता है।
TASK_WIRED_LEDGER_PORT[ledger send right]: इस टास्क को उसकी वायर्ड कर्नेल मेमोरी से जोड़ने के लिए स्रोत का नामकरण करने वाला पोर्ट।
TASK_PAGED_LEDGER_PORT[ledger send right]: इस टास्क को उसकी डिफ़ॉल्ट मेमोरी मैनेज्ड मेमोरी से जोड़ने के लिए स्रोत का नामकरण करने वाला पोर्ट।
Task Ports
मूल रूप से Mach में "प्रक्रियाएँ" नहीं थीं, उसमें "टास्क" था जिसे धागों के एक डिब्बे के रूप में अधिक माना गया था। जब Mach को BSD के साथ मिलाया गया तो हर टास्क को एक BSD प्रक्रिया से संबंधित माना गया। इसलिए हर BSD प्रक्रिया के पास उसे प्रक्रिया बनाने के लिए आवश्यक विवरण होता है और हर Mach टास्क के भी अपने अंदर काम करने की क्षमताएँ होती हैं (केवल अस्थितिग्रस्त pid 0 के लिए जो kernel_task
है के लिए).
इसके साथ दो बहुत दिलचस्प फ़ंक्शन हैं:
task_for_pid(target_task_port, pid, &task_port_of_pid)
: निर्दिष्टpid
द्वारा संबंधित टास्क के लिए टास्क पोर्ट के लिए एक SEND राइट प्राप्त करें और इसे निर्दिष्टtarget_task_port
को दें (जो सामान्यत: कॉलर टास्क होता है जिसनेmach_task_self()
का उपयोग किया है, लेकिन एक अलग टास्क पर एक SEND पोर्ट हो सकता है।)pid_for_task(task, &pid)
: एक टास्क के लिए एक SEND राइट के द्वारा दिया गया, इस टास्क से संबंधित PID का पता लगाएं।
टास्क के भीतर क्रियाएँ करने के लिए, टास्क को अपने आप के लिए SEND
राइट की आवश्यकता थी जो mach_task_self()
को कॉल करके प्राप्त की गई थी (जो task_self_trap
(28) का उपयोग करता है)। इस अनुमति के साथ एक टास्क कई क्रियाएँ कर सकता है जैसे:
task_threads
: टास्क के सभी धागों के लिए SEND राइट प्राप्त करेंtask_info
: टास्क के बारे में जानकारी प्राप्त करेंtask_suspend/resume
: एक टास्क को रोकें या फिर फिर से शुरू करेंtask_[get/set]_special_port
thread_create
: एक धागा बनाएंtask_[get/set]_state
: टास्क स्थिति नियंत्रण करेंऔर अधिक mach/task.h में मिल सकता है।
ध्यान दें कि एक अलग टास्क के टास्क पोर्ट पर एक SEND राइट के साथ, एक अलग टास्क पर ऐसी क्रियाएँ करना संभव है।
इसके अतिरिक्त, टास्क_पोर्ट भी vm_map
पोर्ट है जिससे एक टास्क के भीतर मेमोरी पढ़ने और संशोधित करने की अनुमति होती है जैसे vm_read()
और vm_write()
के फ़ंक्शन के साथ। यह मूल रूप से इसका मतलब है कि एक टास्क जिसके पास एक अलग टास्क के टास्क_पोर्ट पर SEND राइट है, उस टास्क में कोड इंजेक्ट करने में सक्षम होगा।
ध्यान रखें कि क्योंकि कर्नेल भी एक टास्क है, अगर कोई SEND अनुमतियाँ प्राप्त कर लेता है kernel_task
पर, तो वह कर्नेल को कुछ भी निष्पादित करने की क्षमता होगी (जेलब्रेक्स).
mach_task_self()
को कॉल करने के लिए नाम प्राप्त करने के लिए इस पोर्ट के लिए कॉल करें कॉलर टास्क के लिए। यह पोर्ट केवलexec()
के अवरोध के बाहर विरासत है;fork()
के साथ नई टास्क बनाई जाती है (एक विशेष मामले के रूप में, एक टास्क कोexec()
के बाद भी एक नया टास्क पोर्ट मिलता है।) टास्क उत्पन्न करने और इसका पोर्ट प्राप्त करने का एकमात्र तरीका है "पोर्ट स्वैप नृत्य" करते समयfork()
करते समय।इस पोर्ट तक पहुंचने की प्रतिबंधाएँ (बाइनरी
AppleMobileFileIntegrity
सेmacos_task_policy
से):यदि ऐप के पास
com.apple.security.get-task-allow
entitlement है तो एक ही उपयोगकर्ता से समान प्रक्रियाएँ टास्क पोर्ट तक पहुंच सकती हैं (डीबगिंग के लिए Xcode द्वारा सामान्यत: जोड़ा जाता है)। नोटराइज़ेशन प्रक्रिया इसे उत्पादन रिलीज़ के लिए नहीं अनुमति देगी।com.apple.system-task-ports
entitlement वाले ऐप्स किसी भी प्रक्रिया के लिए टास्क पोर्ट प्राप्त कर सकते हैं, केवल कर्नेल को नहीं। पुराने संस्करणों में इसेtask_for_pid-allow
कहा जाता था। यह केवल Apple एप्लिकेशन्स को प्रदान किया जाता है।रूट ऐप्स एक हार्डन्ड रनटाइम के साथ कंपाइल नहीं की गई प्रक्रियाओं के टास्क पोर्ट तक पहुंच सकते हैं (और न केवल Apple से).
टास्क नाम पोर्ट: एक टास्क पोर्ट का एक अनधिकृत संस्करण। यह टास्क को संदर्भित करता है, लेकिन इसे नियंत्रित करने की अनुमति नहीं देता। इसके माध्यम से उपलब्ध एकमात्र चीज है task_info()
।
Thread Ports
धागों के साथ भी संबंधित पोर्ट होते हैं, जो टास्क को कॉल करने से दिखाई देते हैं task_threads
और प्रोसेसर के साथ processor_set_threads
। धागे पोर्ट के लिए एक SEND राइट थ्रेड एक्ट उपप्रणाली से फ़ंक्शन का उपयोग करने की अनुमति देता है, जैसे:
thread_terminate
thread_[get/set]_state
act_[get/set]_state
thread_[suspend/resume]
thread_info
...
किसी भी धागे को इस पोर्ट को प्राप्त करने के लिए mach_thread_sef
कॉल कर सकता है।
धागे के माध्यम से शेलकोड इंजेक्शन टास्क पोर्ट के माध्यम से
आप यहां से एक शेलकोड प्राप्त कर सकते हैं:
Introduction to ARM64v8{% टैब शीर्षक="entitlements.plist" %}
कंपाइल करें पिछले प्रोग्राम को और अधिकार जोड़ें कोड इंजेक्शन करने के लिए उसी उपयोगकर्ता के साथ (अगर नहीं तो आपको sudo का उपयोग करना होगा)।
Last updated