簡體   English   中英

iPhone靜態代碼分析器

[英]iPhone Static Code Analyzer

iPhone開發人員社區之間的共識是,蘋果公司最近開始使用靜態代碼分析工具來檢測未記錄的API調用的使用。

僅出於參數考慮,我想知道是否有可能通過在運行時生成如下調用來解決此工具:

NSString *const aMethod = @"doStuff:withStuff:";
SEL aSelector = NSSelectorFromString(aMethod);
NSMethodSignature *aSignature = [targetObject methodSignatureForSelector:aSelector];
NSInvokation *anInvokation = [NSInvokation invocationWithMethodSignature:aSignature];
[anInvokation setTarget:targetObject];
[anInvokation setSelector:aSelector];
[anInvokation setArgument:&firstArg atIndex:2];
[anInvokation setArgument:&secondArg atIndex:3];
[anInvokation invoke];

這似乎太容易了,所以我想知道-我想念什么? Apple如何使用程序集上的靜態代碼分析來檢測到這一點?

要點:

  1. 我知道方法名稱將作為靜態字符串存儲在二進制文件中。 但是,在運行時以及使用stringWithFormat:或其他類型的輕微混淆(足以混淆靜態分析器)的情況下生成方法名稱將是微不足道的。
  2. 我知道,即使使用gdb進行最簡單的運行時分析,也可以揭示這種技巧-我的理解是Apple分析了二進制文件本身,也許我對此完全錯了。

為什么要在意呢? 您不應有充分的理由使用私有API:Apple隨時可能輕易破壞您的應用程序,使您的用戶不安。

也就是說,使用NSInvocation,-performSelector:或任何其他類似的技術可能足以避免被靜態分析器檢測到。

我想你已經讀了這篇文章 同樣有趣的是這一個 我的解釋是,Apple的靜態分析器確實會產生誤報,只是因為某些人使用與私有方法同名的方法。 如果分析器完成了運行時分析或徹底檢查了哪些類的選擇器,則不會發生這種情況。 因此,似乎他們主要是在尋找二進制文件中匹配的字符串或選擇器。 我認為結合使用NSInvocation和一些字符串混淆將幫助您解決問題。 不過,我仍然建議不要依賴私有API。

有一種簡單的方法可以找出答案!

通過您問題中的方法制作一個故意使用隱藏api的應用,並查看是否被接受!

山姆

PS:如果您確實找到了,請確保您告訴我們; 我們都想肯定知道,Apple肯定不會告訴我們!

暫無
暫無

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

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