Apple รู้ได้อย่างไรว่าคุณใช้ API ส่วนตัว


109

ฉันส่งไฟล์ไบนารีไปยัง Apple โดยไม่มีซอร์สโค้ดใด ๆ

นอกเหนือจากการตรวจสอบซอร์สโค้ดด้วยตนเองแล้ว Apple รู้ได้อย่างไรว่าใช้อะไรและเรียกว่า API อะไร


เปลี่ยนชื่อ - ฉันคิดว่าคุณหมายถึง "Apple รู้ได้อย่างไร .. "
Anurag

คำตอบ:


173

มี 3 วิธีที่ฉันรู้ นี่เป็นเพียงการคาดเดาเนื่องจากฉันไม่ได้ทำงานในทีมตรวจสอบของ Apple

1. otool -L

นี่จะแสดงรายการไลบรารีทั้งหมดที่แอพเชื่อมโยง สิ่งที่ชัดเจนที่คุณไม่ควรใช้เช่น IOKit และ WebKit สามารถตรวจพบได้จากสิ่งนี้

2. nm -u

สิ่งนี้จะแสดงรายการสัญลักษณ์ที่เชื่อมโยงทั้งหมด สิ่งนี้สามารถตรวจจับได้

  • ฟังก์ชัน C ที่ไม่มีเอกสารเช่น _UIImageWithName;
  • คลาส Objective-C เช่น UIProgressHUD
  • Ivars เช่นUITouch._phase(ซึ่งอาจเป็นสาเหตุของการปฏิเสธแอปที่ใช้ Three20ไม่กี่เดือนที่ผ่านมา)

3. รายการตัวเลือก Objective-C หรือ strings

ตัวเลือก Objective-C จะถูกเก็บไว้ในพื้นที่พิเศษของไบนารีดังนั้น Apple จึงสามารถดึงเนื้อหาจากที่นั่นและตรวจสอบว่าคุณใช้เมธอด Objective-C ที่ไม่มีเอกสารหรือไม่เช่น-[UIDevice setOrientation:].

เนื่องจากตัวเลือกเป็นอิสระจากคลาสที่คุณกำลังส่งข้อความถึงแม้ว่าคลาสที่กำหนดเองของคุณจะกำหนดว่า-setOrientation:ไม่เกี่ยวข้องกับ UIDevice แต่ก็มีความเป็นไปได้ที่จะถูกปฏิเสธ


คุณสามารถใช้APIKit ของ Erica Sadunเพื่อตรวจจับการปฏิเสธที่อาจเกิดขึ้นเนื่องจาก API ส่วนตัว (สัญญาณเตือนที่ผิดพลาด)


(หากคุณต้องการแก้ไขปัญหาการตรวจสอบเหล่านี้จริงๆคุณสามารถใช้คุณสมบัติรันไทม์เช่น

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey:; object_getInstanceVariable, object_getIvar ฯลฯ

เพื่อรับไลบรารีคลาสวิธีการและ ivars ส่วนตัวเหล่านั้น )


คำตอบที่ดี ฉันจะเพิ่มว่าหากแอปพลิเคชันของคุณกำลังทำสิ่งที่ยากมากที่จะทำได้โดยไม่ต้องใช้ API ส่วนตัวฉันมั่นใจว่าแอปของคุณจะได้รับการตรวจสอบเป็นพิเศษ
Matthew Frederick

ฉันอยากรู้เกี่ยวกับวิธีแก้ปัญหาในการโทรหาวิธีส่วนตัว ฉันคิดว่าคอมไพเลอร์จะสร้างการเรียกไปที่ objc_msgSend (foo, @selector (privateMethod)) สำหรับ [foo privateMethod] ดังนั้นหาก Apple สามารถตรวจจับการโทรโดยตรงของ privateMethod พวกเขายังสามารถตรวจจับการโทรทางอ้อมผ่าน objc_msgSend (หรือ performSelector :)
an0

ฉันสงสัยว่าทำไมคุณถึงบอกว่าคุณไม่ควรเชื่อมโยงกับ IOKit และ WebKit?
hjaltij

2
คุณดำเนินการ otool บนอะไร? ไฟล์. app
Rob

1
@Eric พวกเขาทำได้แม้ว่าเวอร์ชันเครื่องมือดังกล่าวอาจส่งผลต่อประสิทธิภาพ ไม่ว่าจะเห็น API ส่วนตัวเข้าสู่ App Store ซ้ำ ๆ ก็ชัดเจนว่าพวกเขาไม่ได้ทำเช่นนี้หรืออย่างน้อยก็ไม่ได้ทำตลอดเวลา
เนท

26

คุณสามารถแสดงรายการตัวเลือกในโปรแกรม Mach-O โดยใช้ซับเดียวต่อไปนี้ใน Terminal:

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, @Robert Diamond คุณช่วยอธิบายเพิ่มเติมสำหรับสิ่งเดียวกันนี้ได้ไหม ฉันต้องการตรวจสอบว่า Google analytic ใช้การโทรแบบ UDID หรือไม่ ขอบคุณ
Mangesh

13

สมมติว่าคุณต้องการใช้ API ส่วนตัว วัตถุประสงค์ C ช่วยให้คุณสร้าง SEL จากสตริง:

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

หุ่นยนต์หรือการสแกนห้องสมุดจะจับสิ่งนี้ได้อย่างไร พวกเขาจะต้องจับสิ่งนี้โดยใช้เครื่องมือบางอย่างที่ตรวจสอบการเข้าถึงส่วนตัวที่รันไทม์ แม้ว่าพวกเขาจะสร้างเครื่องมือรันไทม์ดังกล่าว แต่ก็ยากที่จะจับได้เนื่องจากการเรียกนี้อาจซ่อนอยู่ในเส้นทางที่ไม่ค่อยได้ใช้งาน


user1203764 แสดงความคิดเห็นว่าสามารถตรวจพบการโทรประเภทนี้ได้จริง
Rup

@Rup ต้องการแสดงความคิดเห็นเกี่ยวกับคำถามของฉันที่นี่เกี่ยวกับการใช้ valueForKey โปรด? stackoverflow.com/questions/11923597/…
Dan Rosenstark

1
@ คำถามที่น่าสนใจ! แต่ฉันมีผู้เชี่ยวชาญไม่เพียงพอที่จะแสดงความคิดเห็นขอโทษ สิ่งที่ Farcaller พูดนั้นดูสมเหตุสมผลสำหรับฉัน
Rup

ขอบคุณ @Rup เห็นได้ชัดว่าไม่มีใครเพียงพอที่จะเป็นผู้เชี่ยวชาญในสาขานี้ :)
Dan Rosenstark

คนที่ฉันรู้จักบอกว่าเขาเพิ่งได้รับสายแบบนี้ใน App Store
bugloaf

7

ฉันจินตนาการว่าพวกเขามองไปที่สัญลักษณ์ทั้งหมดที่ไบนารีของคุณพยายามจะนำเข้า (ไม่ต้องสงสัยเลยว่าข้อมูลเหล่านี้สามารถใช้ได้อย่างง่ายดายในตารางสัญลักษณ์ดังกล่าว) และแจ้งให้คุณทราบหากพบสัญลักษณ์เหล่านี้ใน "รายการ API ส่วนตัว" ในความเป็นจริงค่อนข้างง่ายที่จะทำให้เป็นอัตโนมัติ


1
อันที่จริงฉันสามารถพูดด้วยความมั่นใจว่านี่ไม่ใช่กรณี (อย่างน้อยก็ไม่ใช่ทั้งหมดที่ทำ) โดยพิจารณาจากการใช้งาน API ส่วนตัวที่ฉันรู้ว่าผ่านมาได้ หากนี่เป็นสิ่งที่จำเป็นการใช้งาน API ส่วนตัวจะไม่ลื่นผ่าน ประสบการณ์ของฉันชี้ให้เห็นว่าคำตอบของ Kenny ™นั้นถูกต้องเกือบแน่นอน นี่คือพื้นที่ที่ Objective-C แตกต่างจากภาษาอื่นโดยพื้นฐานเช่น C.
Nate

1

ไฟล์ปฏิบัติการไม่ใช่กล่องดำ หากคุณโทรหาห้องสมุดก็เป็นเรื่องง่ายที่จะหา นี่คือสาเหตุที่ฉันเสียใจกับการสูญเสียภาษาแอสเซมบลีในการศึกษา CS สมัยใหม่ =] เครื่องมือเช่น ldd จะบอกคุณว่าคุณได้เชื่อมโยงอะไรบ้าง แต่ฉันจำไม่ได้ว่าชาติใดของ ldd สร้างขึ้นในชุด mac iPhone dev kit


1
ฉันสงสัยอยู่บ่อยครั้ง: ถ้าคุณจะเขียนไบนารีของคุณเพื่อแก้ไขตัวเองเพียงสร้างโค้ดเพื่อนำเข้า API ส่วนตัวหลังจากที่ตรงตามเกณฑ์บางประการ (เช่นหลังจากวันที่เผยแพร่แอปของคุณ) ไม่ว่า Apple จะจับได้หรือไม่ พวกเขารายงานกลับมาให้เราทราบสถิติที่น่าสนใจเช่นจำนวนเกมของเราที่กำลังทำงานบนโทรศัพท์ที่เจลเบรค
Sniggerfardimungus

@ user30997 รหัสสิทธิพิเศษสามารถเข้าถึงได้ผ่านทางระบบเท่านั้น เธรดที่ดำเนินการจะเปลี่ยนเป็นสิทธิ์ที่สูงขึ้นและตรวจสอบว่าสิทธิ์ก่อนหน้านี้มีสิทธิ์ในการรันโค้ดหรือไม่ นั่นเป็นเพียงตัวอย่างเท่านั้น แต่มีวิธีอื่น ๆ ในการทำเช่นนี้ แต่ฉันสงสัยอย่างยิ่งว่านักพัฒนาจะไร้เดียงสาพอที่จะละทิ้งกลไกการตรวจสอบสิทธิ์รันไทม์พื้นฐานเช่นนี้มันจะได้รับการเผยแพร่อย่างแน่นอนในตอนนี้
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳


1

นอกเหนือจากการตรวจสอบสัญลักษณ์ ...

apple สามารถมีเวอร์ชันของ sdk ที่ตรวจสอบแต่ละเมธอดส่วนตัวได้อย่างง่ายดายเมื่อถูกเรียกเพื่อให้แน่ใจว่าถูกป้อนจากวิธีใดวิธีหนึ่งที่กำหนด


นั่นยังไม่เพียงพอเนื่องจากโปรแกรมสามารถโทรหาการโทรส่วนตัวนี้ได้ในเวลาที่กำหนดในอนาคตเท่านั้นขึ้นอยู่กับตรรกะอื่น ๆ ในการตรวจสอบข้อเท็จจริงนี้ Apple ต้องบล็อก API ส่วนตัวทั้งหมดหรือให้เฟรมเวิร์กรายงานการเรียก API ส่วนตัวไปยัง Apple โดยอัตโนมัติซึ่งส่งผลเสียต่อประสิทธิภาพอย่างมาก
Motti Shneor

0

แม้ว่าคุณจะเชื่อมโยงแบบคงที่ แต่ที่แย่ที่สุดก็สามารถนำตัวอย่างของโค้ดจาก API ส่วนตัวในรายการและค้นหาไบนารีของคุณเทียบเคียงได้ (ค่อนข้างง่ายในการทำให้เป็นอัตโนมัติ)

เมื่อรู้จัก Apple ฉันคิดว่าพวกเขามีระบบอัตโนมัติที่ครอบคลุมและความไม่แน่นอนใด ๆ อาจถูกปฏิเสธหรือตรวจสอบด้วยตนเอง

ในตอนท้ายของวันฉันคิดว่ามันอาจไม่คุ้มค่าที่จะพยายามหลอก Apple


4
การรู้จัก Apple กระบวนการตรวจสอบของพวกเขาเมื่อพบความไม่แน่นอนเกี่ยวข้องกับการแบ่งลูกเต๋าออกมาเพื่อความรวดเร็วสูงสุด
เพียงแค่ความเห็นที่ถูกต้องของฉัน

0

แอปพลิเคชันเดสก์ท็อปนี้คือApp Scannerสามารถสแกนไฟล์. app สำหรับการใช้งาน API ส่วนตัวโดยการแยกไฟล์ Mach-O Binary ถ้าทำได้ Apple ก็ทำได้เช่นกัน!


0

มีเครื่องมือมากมายสำหรับการทำวิศวกรรมย้อนกลับที่อนุญาตให้ตรวจสอบโค้ดได้

  • nm - แสดงรายการสัญลักษณ์จากไฟล์วัตถุ
  • objdump - แสดงข้อมูลจากไฟล์วัตถุ
  • otool- ดูเนื้อหาของไฟล์ปฏิบัติการMach-O [About]
  • strings - สิ่งนี้จะทำให้คุณได้รับสตริงทั้งหมด

คุณสามารถค้นหาตัวอย่าง / การแสดงการใช้คำสั่งเหล่านี้ได้ในส่วนสำคัญสำหรับObjective-CและSwift

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.