[英]How does Apple know you are using private API?
我向 Apple 提交了一個二進制文件,沒有任何源代碼。
除了手動檢查源代碼之外,Apple 如何知道使用了什么以及您調用了哪些 API?
我知道有3種方法。 這些只是一些猜測,因為我不在 Apple 審查團隊工作。
otool -L
這將列出應用程序鏈接到的所有庫。 顯然你不應該使用的東西,比如 IOKit 和 WebKit 可以通過這個檢測到。
nm -u
這將列出所有鏈接的符號。 這可以檢測
UITouch._phase
類的UITouch._phase
(這可能是最近幾個月 基於 Three20 的應用程序被 拒絕的原因。)strings
Objective-C 選擇器存儲在二進制文件的一個特殊區域,因此 Apple 可以從那里提取內容,並檢查您是否使用了一些未公開的 Objective-C 方法,例如-[UIDevice setOrientation:]
。
由於選擇器獨立於您正在發送消息的類,即使您的自定義類定義了-setOrientation:
與 UIDevice 無關,也有可能被拒絕。
您可以使用Erica Sadun 的 APIKit來檢測由於(誤報)私有 API 導致的潛在拒絕。
(如果你真的真的真的真的很想解決這些檢查,你可以使用運行時功能,例如
-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-C和Swift 的要點中找到使用這些命令的示例/表示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.