iPhone静态代码分析器

时间:2009-11-29 09:33:55

标签: iphone objective-c cocoa-touch static-analysis

iPhone开发者社区的共识是,Apple最近开始使用静态代码分析工具来检测未记录的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分析了二进制文件本身,也许我对此完全错了。

3 个答案:

答案 0 :(得分:4)

为何关心?您不应该使用私有API有充分理由:Apple可能会随时轻易破坏您的应用程序,从而使您的用户感到不安。

也就是说,使用NSInvocation,-performSelector:或任何其他类似的技术可能足以避免静态分析器的检测。

答案 1 :(得分:2)

我想你已经读过this article了。同样有趣的是this one。我的解释是,Apple的静态分析器确实会产生误报,因为有些人使用与私有方法同名的方法。如果分析器已完成运行时分析或彻底检查已调用哪些类的选择器,则不会发生这种情况。所以,看起来他们主要是在二进制文件中寻找匹配的字符串或选择器。我认为使用NSInvocation结合一些字符串混淆会让你通过。不过,我仍然建议不要依赖私有API。

答案 2 :(得分:1)

有一种简单的方法可以找到答案!

制作一个应用程序,通过您问题中的方法故意使用隐藏的api,如果被接受,请查看它!

萨姆

PS如果你确实发现了,请务必告诉我们;我们都很想知道,Apple肯定不会告诉我们!