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分析了二进制文件本身,也许我对此完全错了。
有帮助吗?

解决方案

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

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

scroll top