簡體   English   中英

Apple 如何知道您使用的是私有 API?

[英]How does Apple know you are using private API?

我向 Apple 提交了一個二進制文件,沒有任何源代碼。

除了手動檢查源代碼之外,Apple 如何知道使用了什么以及您調用了哪些 API?

我知道有3種方法。 這些只是一些猜測,因為我不在 Apple 審查團隊工作。

1. otool -L

這將列出應用程序鏈接到的所有庫。 顯然你不應該使用的東西,比如 IOKit 和 WebKit 可以通過這個檢測到。

2. nm -u

這將列出所有鏈接的符號。 這可以檢測

  • 未公開的 C 函數,例如 _UIImageWithName;
  • Objective-C 類,例如 UIProgressHUD
  • 諸如UITouch._phase類的UITouch._phase (這可能是最近幾個月 基於 Three20 的應用程序拒絕的原因。)

3. 列出 Objective-C 選擇器或strings

Objective-C 選擇器存儲在二進制文件的一個特殊區域,因此 Apple 可以從那里提取內容,並檢查您是否使用了一些未公開的 Objective-C 方法,例如-[UIDevice setOrientation:]

由於選擇器獨立於您正在發送消息的類,即使您的自定義類定義了-setOrientation:與 UIDevice 無關,也有可能被拒絕。


您可以使用Erica Sadun 的 APIKit來檢測由於(誤報)私有 API 導致的潛在拒絕。


(如果你真的真的真的真的很想解決這些檢查,你可以使用運行時功能,例如

  • dlopen, dlsym
  • objc_getClass、sel_registerName、objc_msgSend
  • -valueForKey: ; object_getInstanceVariable、object_getIvar 等。

獲取那些私有庫、類、方法和變量。 )

您可以在終端中使用以下單行代碼在 Mach-O 程序中列出選擇器:

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 列表”中找到了這些符號中的任何一個,他們就會告訴您。 事實上,很容易實現自動化。

除了符號調查...

蘋果可以很容易地擁有一個 sdk 版本,它在調用時檢查每個私有方法堆棧,以確保它是從指定的方法之一輸入的。

可執行文件並不完全是一個黑匣子。 如果你打電話到圖書館,很容易找到。 這就是為什么我對現代 CS 教育中匯編語言的丟失感到遺憾。 =] ldd 之類的工具會告訴您鏈接的內容,盡管我不記得 ldd 的哪個版本使它成為 mac iPhone 開發工具包。

otool -L somebinary

即使您是靜態鏈接,在最壞的情況下,他們也可以從其列表中的私有 API 中獲取代碼樣本,並針對它們搜索您的二進制文件(也相對容易自動化)。

了解 Apple,我敢打賭他們有一個全面的自動化系統,任何不確定性都可能被拒絕或手動審查。

歸根結底,我認為嘗試愚弄 Apple 可能不值得。

這個桌面應用程序App Scanner可以通過分離 Mach-O 二進制文件來掃描 .app 文件以獲取私有 api 使用。 如果可以,那么蘋果也可以!

有很多逆向工程工具可以檢查代碼

  • nm - 列出目標文件中的符號
  • objdump - 顯示來自目標文件的信息。
  • otool - 查看 Mach-O [About]可執行文件的內容
  • strings - 這將為您提供所有字符串。

您可以在Objective-CSwift 的要點中找到使用這些命令的示例/表示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM