ฉันส่งไฟล์ไบนารีไปยัง Apple โดยไม่มีซอร์สโค้ดใด ๆ
นอกเหนือจากการตรวจสอบซอร์สโค้ดด้วยตนเองแล้ว Apple รู้ได้อย่างไรว่าใช้อะไรและเรียกว่า API อะไร
ฉันส่งไฟล์ไบนารีไปยัง Apple โดยไม่มีซอร์สโค้ดใด ๆ
นอกเหนือจากการตรวจสอบซอร์สโค้ดด้วยตนเองแล้ว Apple รู้ได้อย่างไรว่าใช้อะไรและเรียกว่า API อะไร
คำตอบ:
มี 3 วิธีที่ฉันรู้ นี่เป็นเพียงการคาดเดาเนื่องจากฉันไม่ได้ทำงานในทีมตรวจสอบของ Apple
otool -L
นี่จะแสดงรายการไลบรารีทั้งหมดที่แอพเชื่อมโยง สิ่งที่ชัดเจนที่คุณไม่ควรใช้เช่น IOKit และ WebKit สามารถตรวจพบได้จากสิ่งนี้
nm -u
สิ่งนี้จะแสดงรายการสัญลักษณ์ที่เชื่อมโยงทั้งหมด สิ่งนี้สามารถตรวจจับได้
UITouch._phase
(ซึ่งอาจเป็นสาเหตุของการปฏิเสธแอปที่ใช้ Three20ไม่กี่เดือนที่ผ่านมา)strings
ตัวเลือก Objective-C จะถูกเก็บไว้ในพื้นที่พิเศษของไบนารีดังนั้น Apple จึงสามารถดึงเนื้อหาจากที่นั่นและตรวจสอบว่าคุณใช้เมธอด Objective-C ที่ไม่มีเอกสารหรือไม่เช่น-[UIDevice setOrientation:]
.
เนื่องจากตัวเลือกเป็นอิสระจากคลาสที่คุณกำลังส่งข้อความถึงแม้ว่าคลาสที่กำหนดเองของคุณจะกำหนดว่า-setOrientation:
ไม่เกี่ยวข้องกับ UIDevice แต่ก็มีความเป็นไปได้ที่จะถูกปฏิเสธ
คุณสามารถใช้APIKit ของ Erica Sadunเพื่อตรวจจับการปฏิเสธที่อาจเกิดขึ้นเนื่องจาก API ส่วนตัว (สัญญาณเตือนที่ผิดพลาด)
(หากคุณต้องการแก้ไขปัญหาการตรวจสอบเหล่านี้จริงๆคุณสามารถใช้คุณสมบัติรันไทม์เช่น
-valueForKey:
; object_getInstanceVariable, object_getIvar ฯลฯเพื่อรับไลบรารีคลาสวิธีการและ ivars ส่วนตัวเหล่านั้น )
คุณสามารถแสดงรายการตัวเลือกในโปรแกรม 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/,$_))))))'
สมมติว่าคุณต้องการใช้ API ส่วนตัว วัตถุประสงค์ C ช่วยให้คุณสร้าง SEL จากสตริง:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
หุ่นยนต์หรือการสแกนห้องสมุดจะจับสิ่งนี้ได้อย่างไร พวกเขาจะต้องจับสิ่งนี้โดยใช้เครื่องมือบางอย่างที่ตรวจสอบการเข้าถึงส่วนตัวที่รันไทม์ แม้ว่าพวกเขาจะสร้างเครื่องมือรันไทม์ดังกล่าว แต่ก็ยากที่จะจับได้เนื่องจากการเรียกนี้อาจซ่อนอยู่ในเส้นทางที่ไม่ค่อยได้ใช้งาน
ฉันจินตนาการว่าพวกเขามองไปที่สัญลักษณ์ทั้งหมดที่ไบนารีของคุณพยายามจะนำเข้า (ไม่ต้องสงสัยเลยว่าข้อมูลเหล่านี้สามารถใช้ได้อย่างง่ายดายในตารางสัญลักษณ์ดังกล่าว) และแจ้งให้คุณทราบหากพบสัญลักษณ์เหล่านี้ใน "รายการ API ส่วนตัว" ในความเป็นจริงค่อนข้างง่ายที่จะทำให้เป็นอัตโนมัติ
ไฟล์ปฏิบัติการไม่ใช่กล่องดำ หากคุณโทรหาห้องสมุดก็เป็นเรื่องง่ายที่จะหา นี่คือสาเหตุที่ฉันเสียใจกับการสูญเสียภาษาแอสเซมบลีในการศึกษา CS สมัยใหม่ =] เครื่องมือเช่น ldd จะบอกคุณว่าคุณได้เชื่อมโยงอะไรบ้าง แต่ฉันจำไม่ได้ว่าชาติใดของ ldd สร้างขึ้นในชุด mac iPhone dev kit
otool -L somebinary
นอกเหนือจากการตรวจสอบสัญลักษณ์ ...
apple สามารถมีเวอร์ชันของ sdk ที่ตรวจสอบแต่ละเมธอดส่วนตัวได้อย่างง่ายดายเมื่อถูกเรียกเพื่อให้แน่ใจว่าถูกป้อนจากวิธีใดวิธีหนึ่งที่กำหนด
แม้ว่าคุณจะเชื่อมโยงแบบคงที่ แต่ที่แย่ที่สุดก็สามารถนำตัวอย่างของโค้ดจาก API ส่วนตัวในรายการและค้นหาไบนารีของคุณเทียบเคียงได้ (ค่อนข้างง่ายในการทำให้เป็นอัตโนมัติ)
เมื่อรู้จัก Apple ฉันคิดว่าพวกเขามีระบบอัตโนมัติที่ครอบคลุมและความไม่แน่นอนใด ๆ อาจถูกปฏิเสธหรือตรวจสอบด้วยตนเอง
ในตอนท้ายของวันฉันคิดว่ามันอาจไม่คุ้มค่าที่จะพยายามหลอก Apple
แอปพลิเคชันเดสก์ท็อปนี้คือApp Scannerสามารถสแกนไฟล์. app สำหรับการใช้งาน API ส่วนตัวโดยการแยกไฟล์ Mach-O Binary ถ้าทำได้ Apple ก็ทำได้เช่นกัน!
มีเครื่องมือมากมายสำหรับการทำวิศวกรรมย้อนกลับที่อนุญาตให้ตรวจสอบโค้ดได้
nm
- แสดงรายการสัญลักษณ์จากไฟล์วัตถุ objdump
- แสดงข้อมูลจากไฟล์วัตถุotool
- ดูเนื้อหาของไฟล์ปฏิบัติการMach-O [About]strings
- สิ่งนี้จะทำให้คุณได้รับสตริงทั้งหมดคุณสามารถค้นหาตัวอย่าง / การแสดงการใช้คำสั่งเหล่านี้ได้ในส่วนสำคัญสำหรับObjective-CและSwift