Apple कैसे जानता है कि आप निजी API का उपयोग कर रहे हैं?


109

मैंने Apple को बिना किसी सोर्स कोड के बाइनरी फाइल सबमिट कर दी।

स्रोत कोड को मैन्युअल रूप से जाँचने के अलावा Apple को कैसे पता चलता है कि क्या उपयोग किया गया था और आपने कौन से API को कॉल किया है?


बदला हुआ शीर्षक - मुझे लगता है कि आपका मतलब "एप्पल कैसे जानता है .."
अनुराग

जवाबों:


173

मुझे पता है कि 3 तरीके हैं। ये सिर्फ कुछ अटकलें हैं, क्योंकि मैं Apple समीक्षा टीम में काम नहीं करता हूं।

1। otool -L

यह उन सभी पुस्तकालयों को सूचीबद्ध करेगा, जिनसे ऐप जुड़ा है। कुछ स्पष्ट रूप से आपको उपयोग नहीं करना चाहिए, जैसे कि IOKit और WebKit द्वारा इसका पता लगाया जा सकता है।

2। nm -u

यह सभी लिंक किए गए प्रतीकों को सूचीबद्ध करेगा। यह पता लगा सकता है

3. लिस्टिंग उद्देश्य-सी चयनकर्ताओं, या strings

उद्देश्य-सी चयनकर्ताओं को बाइनरी के एक विशेष क्षेत्र में संग्रहीत किया जाता है, और इसलिए ऐप्पल वहां से सामग्री निकाल सकता है, और जांचें कि क्या आपने कुछ अनिर्दिष्ट ऑब्जेक्ट-सी विधियों का उपयोग किया है, जैसे कि -[UIDevice setOrientation:]

चूंकि चयनकर्ता आपके द्वारा भेजे जा रहे वर्ग से स्वतंत्र होते हैं, भले ही आपका कस्टम वर्ग -setOrientation:UIDevice के लिए अप्रासंगिक हो, अस्वीकार किए जाने की संभावना होगी।


निजी एपीआई के (झूठे अलार्म) के कारण संभावित अस्वीकृति का पता लगाने के लिए आप एरिका सदुन के एपीकिट का उपयोग कर सकते हैं ।


(यदि आप वास्तव में वास्तव में वास्तव में इन जांचों को हल करना चाहते हैं, तो आप रनटाइम सुविधाओं का उपयोग कर सकते हैं जैसे कि

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey:; object_getInstanceVariable, object_getIvar, आदि।

उन निजी पुस्तकालयों, कक्षाओं, विधियों और ivars को पाने के लिए। )


बहुत बढ़िया जवाब। मैं सिर्फ इतना जोड़ूंगा कि अगर आपका एप्लिकेशन कुछ ऐसा कर रहा है जो निजी एपीआई का उपयोग किए बिना करना बहुत मुश्किल है, मुझे यकीन है कि आपके ऐप को अतिरिक्त जांच करनी होगी।
मैथ्यू फ्रेडरिक

मैं निजी तरीकों को कॉल करने के समाधान के बारे में उत्सुक हूं। मुझे लगता है कि कंपाइलर [foo PrivateMethod] के लिए objc_msgSend (foo, @selector (PrivateMethod)) पर कॉल जेनरेट करेगा, इसलिए यदि Apple PrivateMethod के सीधे कॉल का पता लगा सकता है तो वे objc_msgSend (या performSelector :) के माध्यम से अप्रत्यक्ष कॉल का पता लगा सकते हैं।
a0

मुझे आश्चर्य है कि आप ऐसा क्यों कहते हैं कि आपको IOKit और WebKit के खिलाफ लिंक नहीं करना चाहिए?
hjaltij

2
क्या आप ओटूल पर अमल करते हैं? .App फ़ाइल?
रॉब

1
@, वे कर सकते हैं , हालांकि इस तरह के एक साधन संस्करण शायद प्रदर्शन को प्रभावित करेगा। भले ही, निजी एपीआई को बार-बार ऐप स्टोर में देखने के बाद, यह स्पष्ट है कि वे ऐसा नहीं करते हैं, या कम से कम हर समय ऐसा नहीं करते हैं।
नैट

26

आप टर्मिनल में निम्नलिखित वन-लाइनर का उपयोग करके चयनकर्ताओं को माच-ओ कार्यक्रम में सूचीबद्ध कर सकते हैं:

otool -s __TEXT __objc_methname "$1" |expand -8 | cut -c17- | sed -n '3,$p' | perl -n -e 'print join("\n",split(/\x00/,scalar reverse (reverse unpack("(a4)*",pack("(H8)*",split(/\s/,$_))))))'

+1, @ रॉबर्ट हीरा, क्या आप उसी के लिए अधिक वर्णन कर सकते हैं। मुझे Google विश्लेषिकी का उपयोग करने की आवश्यकता है UDID कॉल या नहीं। धन्यवाद
मंगेश

13

मान लें कि आप कुछ निजी एपीआई का उपयोग करना चाहते हैं; उद्देश्य C आपको स्ट्रिंग से किसी भी SEL का निर्माण करने की अनुमति देता है:

   SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
    [UIDevice performSelector:my_sel ...];

रोबोट या लाइब्रेरी स्कैन इसे कैसे पकड़ सकता है? उन्हें रनटाइम पर निजी एक्सेस पर नज़र रखने वाले कुछ टूल का उपयोग करके इसे पकड़ना होगा। यहां तक ​​कि अगर वे इस तरह के रनटाइम टूल का निर्माण करते हैं, तो इसे पकड़ना मुश्किल है क्योंकि यह कॉल कुछ दुर्लभ व्यायाम पथ में छिपा हो सकता है।


user1203764 टिप्पणी है कि इस तरह की कॉल का वास्तव में पता लगाया जा सकता है
Rup

@Rup मेरे सवाल पर एक राय रखना चाहते हैं यहां valueForKey का उपयोग करें, कृपया? stackoverflow.com/questions/11923597/…
दान रोसेनस्टार्क

1
@ यार दिलचस्प सवाल! लेकिन मैं खेद व्यक्त करने के लिए एक विशेषज्ञ के रूप में पर्याप्त नहीं हूं। फरकलर ने जो कहा वह मुझे उचित लगता है
Rup

धन्यवाद @Rup, कोई भी स्पष्ट रूप से इस क्षेत्र में एक विशेषज्ञ के लिए पर्याप्त नहीं है :)
Dan Rosenstark

मुझे पता है कि कोई कहता है कि उसे ऐप स्टोर में इस तरह का कॉल आया था।
Bugloaf

7

मुझे लगता है कि वे सभी प्रतीकों को देखने की कोशिश कर रहे हैं जो आपके बाइनरी को आयात करने की कोशिश कर रहे हैं (प्रतीक तालिका में उन्हें आसानी से उपलब्ध होने में कोई संदेह नहीं है) और आपको डिंग करता है यदि उन प्रतीकों में से कोई भी उनकी "निजी एपीआई सूची" में पाया जाता है। वास्तव में स्वचालित करने के लिए बहुत आसान है।


1
वास्तव में, मैं निश्चितता के साथ कह सकता हूं कि यह निजी एपीआई उपयोग के आधार पर ऐसा नहीं है (कम से कम यह सब वे ऐसा नहीं करते हैं), जो मुझे पता है। यदि यह सब आवश्यक था, तो निजी एपीआई उपयोग के माध्यम से नहीं खिसकेगा । मेरा अनुभव बताता है कि केनीटीएम का उत्तर लगभग निश्चित रूप से सही है। यह एक ऐसा क्षेत्र है जहाँ उद्देश्य-सी मूल रूप से अन्य भाषाओं की तुलना में अलग है, जैसे सी।
नैट

1

एक निष्पादन योग्य बिल्कुल एक ब्लैक बॉक्स नहीं है। यदि आप किसी पुस्तकालय में बुलाते हैं, तो यह एक आसान बात है। यही कारण है कि मैं आधुनिक सीएस शिक्षा में विधानसभा भाषाओं के नुकसान का शोक मनाता हूं। =] Ldd जैसे उपकरण आपको बताएंगे कि आपने क्या लिंक किया है, हालांकि मुझे याद नहीं है कि ldd के किस अवतार ने इसे मैक iPhone देव किट में बनाया है।


1
मुझे अक्सर आश्चर्य होता है: यदि आप अपने बाइनरी को स्व-संशोधित करने के लिए लिख रहे थे, तो केवल कुछ मानदंडों को पूरा करने के बाद एक निजी एपीआई को आयात करने के लिए कोड उत्पन्न करना (जैसे, आपके ऐप की प्रकाशन तिथि के बाद) क्या Apple इसे पकड़ लेगा। वे निश्चित रूप से हमारे लिए कुछ दिलचस्प आंकड़ों की रिपोर्ट करते हैं, जैसे कि हमारे गेम की संख्या जो जेलब्रेक फोन पर चल रहे हैं।
स्निग्गरफर्डिमुंगस

@ user30997, विशेषाधिकार कोड शायद केवल एक सिस्टम कॉल के माध्यम से पहुँचा जा सकता है; निष्पादित विशेषाधिकार एक उच्च विशेषाधिकार में बदल जाता है और जांचता है कि पिछले विशेषाधिकार को कोड निष्पादित करने की अनुमति है या नहीं। यह सिर्फ एक उदाहरण है, हालांकि, इसे करने के अन्य तरीके भी हैं, लेकिन मुझे बहुत संदेह है कि डेवलपर्स इस तरह के एक बुनियादी रनटाइम विशेषाधिकार जाँच तंत्र को छोड़ने के लिए पर्याप्त अनुभवहीन थे, यह निश्चित रूप से अब तक प्रचारित किया जाएगा।
L̲̳̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e


1

प्रतीक जांच से अलग ...

सेब बहुत आसानी से एसडीके का एक संस्करण हो सकता है जो प्रत्येक निजी तरीकों के स्टैक की जांच करता है जब यह सुनिश्चित करने के लिए बुलाया जाता है कि यह निर्दिष्ट विधियों में से एक से दर्ज किया गया है।


यह पर्याप्त नहीं होगा, क्योंकि प्रोग्राम केवल इस निजी कॉल को भविष्य में अन्य तर्क के आधार पर अनियंत्रित समय पर कॉल कर सकता है। इस जांच को करने के लिए Apple को वास्तव में निजी APIs को पूरी तरह से ब्लॉक करना होगा, या ऐप्पल को स्वचालित रूप से Apple के लिए निजी API कॉल की रिपोर्ट करनी चाहिए - जो प्रदर्शन को काफी नुकसान पहुँचाती है।
मोतिन शूरोर

0

यहां तक ​​कि अगर आप सांख्यिकीय रूप से लिंक कर रहे हैं, तो सबसे खराब रूप से, वे अपनी सूची में निजी एपीआई से कोड के नमूने ले सकते हैं, और उनके खिलाफ अपने द्विआधारी को खोज सकते हैं (यह भी स्वचालित रूप से आसान है)।

Apple को पता है, मुझे यकीन है कि उनके पास एक व्यापक, स्वचालित प्रणाली है, और किसी भी अनिश्चितता को या तो अस्वीकार किया जाता है या मैन्युअल रूप से समीक्षा की जाती है।

दिन के अंत में, मुझे लगता है कि यह शायद ऐप्पल की कोशिश करने और मूर्ख बनाने के लायक नहीं है।


4
Apple को किसी भी अनिश्चितता का सामना करने पर उनकी समीक्षा प्रक्रिया को जानने के लिए अधिकतम सनक के लिए पासा का एक सेट तोड़ना शामिल है।
मेरा सही चुनाव

0

यह डेस्कटॉप एप्लिकेशन, ऐप स्कैनर , मच-ओ बाइनरी फ़ाइल को अलग करके निजी एपीआई उपयोग के लिए .app फ़ाइलों को स्कैन कर सकता है। अगर यह हो सकता है, तो Apple भी कर सकता है!


0

रिवर्स इंजीनियरिंग के लिए बहुत सारे उपकरण हैं जो एक कोड का निरीक्षण करने की अनुमति देता है

  • nm - ऑब्जेक्ट फ़ाइलों से प्रतीकों को सूचीबद्ध करता है
  • objdump - ऑब्जेक्ट फ़ाइलों से प्रदर्शन जानकारी।
  • otool- मच-ओ [के बारे में] निष्पादनयोग्य की सामग्री देखें
  • strings - यह आपको सभी तार मिल जाएगा।

आप उद्देश्य-सी और स्विफ्ट के लिए इन कमांडों का उपयोग करने के उदाहरण / प्रतिनिधित्व पा सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.