Câu trả lời:
Có 3 cách tôi biết. Đây chỉ là một số suy đoán, vì tôi không làm việc trong nhóm đánh giá của Apple.
otool -L
Điều này sẽ liệt kê tất cả các thư viện mà ứng dụng đã liên kết đến. Điều này rõ ràng là bạn không nên sử dụng, như IOKit và WebKit.
nm -u
Điều này sẽ liệt kê tất cả các ký hiệu được liên kết. Điều này có thể phát hiện
UITouch._phase
(có thể là nguyên nhân khiến các ứng dụng dựa trên Three20 bị từ chối trong vài tháng qua.)strings
Bộ chọn Objective-C được lưu trữ trong một vùng đặc biệt của nhị phân và do đó Apple có thể trích xuất nội dung từ đó và kiểm tra xem bạn đã sử dụng một số phương pháp Objective-C không có tài liệu chưa, chẳng hạn như -[UIDevice setOrientation:]
.
Vì các bộ chọn độc lập với lớp bạn đang nhắn tin, ngay cả khi lớp tùy chỉnh của bạn xác định -setOrientation:
không liên quan đến UIDevice, sẽ có khả năng bị từ chối.
Bạn có thể sử dụng APIKit của Erica Sadun để phát hiện khả năng bị từ chối do (báo động sai về) các API riêng tư.
(Nếu bạn thực sự thực sự thực sự muốn giải quyết các kiểm tra này, bạn có thể sử dụng các tính năng thời gian chạy như
-valueForKey:
; object_getInstanceVariable, object_getIvar, v.v.để tải các thư viện, lớp, phương thức và ivars riêng đó. )
Bạn có thể liệt kê các bộ chọn trong chương trình Mach-O bằng cách sử dụng một lớp lót sau trong 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/,$_))))))'
Giả sử bạn muốn sử dụng một số API riêng tư; mục tiêu C cho phép bạn tạo bất kỳ SEL nào từ một chuỗi:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
Làm thế nào một robot hoặc quét thư viện có thể bắt được điều này? Họ sẽ phải nắm bắt điều này bằng cách sử dụng một số công cụ giám sát các truy cập riêng tư trong thời gian chạy. Ngay cả khi họ đã xây dựng một công cụ thời gian chạy như vậy, rất khó để bắt được vì lệnh gọi này có thể bị ẩn trong một số đường dẫn hiếm khi được thực hiện.
Tôi tưởng tượng họ xem xét tất cả các ký hiệu mà hệ nhị phân của bạn đang cố gắng nhập (không nghi ngờ gì nữa, họ có thể dễ dàng tìm thấy thông tin trong bảng ký hiệu của chúng) và hỏi bạn nếu bất kỳ ký hiệu nào trong số đó được tìm thấy trong "danh sách API riêng tư" của họ. Trên thực tế, khá dễ dàng để tự động hóa.
Một tệp thực thi không chính xác là một hộp đen. Nếu bạn gọi đến thư viện, đó là một điều dễ dàng tìm thấy. Đây là lý do tại sao tôi than thở về việc mất ngôn ngữ lắp ráp trong các nền giáo dục CS hiện đại. =] Các công cụ như ldd sẽ cho bạn biết những gì bạn đã liên kết, mặc dù tôi không nhớ hóa thân nào của ldd đã đưa nó vào bộ phát triển mac iPhone.
ngoài việc điều tra ký hiệu ...
apple có thể rất dễ dàng có một phiên bản sdk để kiểm tra từng ngăn xếp phương thức riêng tư khi được gọi để đảm bảo rằng nó được nhập từ một trong các phương thức được chỉ định.
Ngay cả khi bạn đang liên kết tĩnh, tệ nhất là họ có thể lấy mẫu mã từ các API riêng tư trong danh sách của họ và tìm kiếm tệp nhị phân của bạn dựa trên chúng (cũng tương đối dễ dàng để tự động hóa).
Biết Apple, tôi dám cá rằng họ có một hệ thống tự động, toàn diện và bất kỳ sự không chắc chắn nào có thể bị từ chối hoặc xem xét thủ công.
Cuối cùng, tôi nghĩ rằng có lẽ không đáng để cố gắng đánh lừa Apple.
Ứng dụng máy tính để bàn này, App Scanner , có thể quét các tệp .app để sử dụng api riêng tư bằng cách tách tệp Mach-O Binary. Nếu có thể, thì Apple cũng có thể!
Có rất nhiều công cụ cho kỹ thuật đảo ngược cho phép kiểm tra mã
nm
- liệt kê các ký hiệu từ các tệp đối tượng objdump
- hiển thị thông tin từ các tệp đối tượng.otool
- xem nội dung của tệp thực thi Mach-O [Giới thiệu]strings
- điều này sẽ giúp bạn có được tất cả các chuỗi.Bạn có thể tìm thấy các ví dụ / đại diện về việc sử dụng các lệnh này trong gists cho Objective-C và Swift