Làm thế nào để Apple biết bạn đang sử dụng API riêng tư?


109

Tôi đã gửi một tệp nhị phân cho Apple mà không có bất kỳ mã nguồn nào.

Ngoài việc kiểm tra mã nguồn theo cách thủ công, làm thế nào Apple biết những gì đã được sử dụng và những API nào bạn đã gọi?


đã thay đổi tiêu đề - Tôi cho rằng ý của bạn là "Làm sao Apple biết .."
Anurag

Câu trả lời:


173

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.

1. 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.

2. 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

3. Liệt kê các bộ chọn Objective-C, hoặc 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ư

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey:; object_getInstanceVariable, object_getIvar, v.v.

để tải các thư viện, lớp, phương thức và ivars riêng đó. )


Câu trả lời chính xác. Tôi chỉ nói thêm rằng nếu ứng dụng của bạn đang làm điều gì đó cực kỳ khó thực hiện mà không sử dụng API riêng, tôi chắc chắn rằng ứng dụng của bạn sẽ được giám sát kỹ lưỡng hơn.
Matthew Frederick

Tôi tò mò về cách gọi các phương thức riêng tư. Tôi nghĩ rằng trình biên dịch sẽ tạo ra cuộc gọi tới objc_msgSend (foo, @selector (privateMethod)) cho [foo privateMethod], vì vậy nếu Apple có thể phát hiện cuộc gọi trực tiếp của privateMethod, họ cũng có thể phát hiện cuộc gọi gián tiếp qua objc_msgSend (hoặc performanceSelector :).
an0

Tôi tự hỏi tại sao bạn nói rằng bạn không nên liên kết chống lại IOKit và WebKit?
hjaltij

2
Bạn thực hiện otool trên cái gì? Tệp .app?
Rob

1
@Eric, họ có thể , mặc dù một phiên bản công cụ như vậy có thể sẽ ảnh hưởng đến hiệu suất. Bất chấp việc các API riêng tư liên tục vào App Store, rõ ràng là họ không làm điều này hoặc ít nhất là không làm điều đó mọi lúc.
Nate

26

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/,$_))))))'

+1, @Robert Diamond, Bạn có thể mô tả thêm cho tương tự không. Tôi cần kiểm tra Google Analytics có sử dụng cuộc gọi UDID hay không. Cảm ơn
Mangesh

13

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.


user1203764 nhận xét rằng những loại cuộc gọi này thực sự có thể được phát hiện
Rup 11/02/12

@Rup muốn đưa ra ý kiến ​​về câu hỏi của tôi ở đây về việc sử dụng valueForKey, làm ơn? stackoverflow.com/questions/11923597/…
Dan Rosenstark,

1
@Yar câu hỏi thú vị! Nhưng tôi không đủ chuyên gia để bình luận xin lỗi. Những gì Farcaller nói có vẻ hợp lý đối với tôi
Rup

Cảm ơn @Rup, không ai rõ ràng là đủ của một chuyên gia trong lĩnh vực này :)
Dan Rosenstark

Một người nào đó tôi biết nói rằng anh ta vừa nhận được một cuộc gọi như thế này vào App Store.
bugloaf

7

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.


1
Trên thực tế, tôi có thể nói một cách chắc chắn rằng đây không phải là trường hợp (ít nhất đó không phải là tất cả những gì họ làm), dựa trên việc sử dụng API riêng mà tôi biết đã vượt qua. Nếu đây là tất cả những gì là cần thiết, sử dụng API tin sẽ không trượt qua. Kinh nghiệm của tôi cho thấy rằng câu trả lời của KennyTM gần như chắc chắn là đúng. Đây là một lĩnh vực mà Objective-C về cơ bản là khác nhau hơn so với các ngôn ngữ khác, như C.
Nate

1

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.


1
Tôi thường tự hỏi: nếu bạn viết tệp nhị phân của mình để tự sửa đổi, chỉ tạo mã để nhập một API riêng sau khi một số tiêu chí đã được đáp ứng (giả sử sau ngày xuất bản ứng dụng của bạn) liệu Apple có nắm bắt được nó hay không. Họ chắc chắn báo cáo lại cho chúng tôi một số thống kê thú vị, chẳng hạn như số lượng trò chơi của chúng tôi đang được chạy trên điện thoại đã jailbreak.
Sniggerfardimungus

@ user30997, Mã đặc quyền có thể chỉ được truy cập thông qua lệnh gọi hệ thống; luồng đang thực thi chuyển thành đặc quyền cao hơn và kiểm tra xem đặc quyền trước đó có quyền thực thi mã hay không. Đó chỉ là một ví dụ, mặc dù có những cách khác để làm việc đó, nhưng tôi rất nghi ngờ các nhà phát triển đã đủ ngây thơ để bỏ qua một đặc ân runtime cơ bản cơ chế kiểm tra như thế này, nó sẽ chắc chắn đã được công bố bởi bây giờ.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳


1

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.


Như vậy sẽ không đủ, bởi vì chương trình chỉ có thể gọi cuộc gọi riêng này vào một thời điểm tùy ý trong tương lai, tùy thuộc vào logic khác. Để thực hiện điều này, Apple thực sự phải chặn hoàn toàn các API riêng tư hoặc yêu cầu các khung công tác tự động báo cáo các lệnh gọi API riêng tư cho Apple - điều này gây hại đáng kể đến hiệu suất.
Motti Shneor

0

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.


4
Biết về Apple, quy trình xem xét của họ khi gặp bất kỳ sự không chắc chắn nào liên quan đến việc phá vỡ một bộ xúc xắc để có mức độ hay thay đổi tối đa.
CHỈ LÀ Ý KIẾN CHÍNH XÁC CỦA TÔI

0

Ứ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ể!


0

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-CSwift

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.