iPhone静态代码分析器

3

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];

这似乎太简单了,我在想——我漏掉了什么?苹果如何可能使用汇编的静态代码分析来检测这个问题?
有几点需要注意: 1. 我知道方法名将作为静态字符串存储在二进制文件中。然而,使用stringWithFormat:或其他轻微混淆的方式在运行时生成方法名也是非常容易的(足以混淆静态分析器)。 2. 我知道即使是最基本的gdb运行时分析也会揭示这个技巧——我的理解是苹果分析的是二进制文件本身,也许我完全错了。

iPhone SDK和开发工具是根据合同授权给您的。如果您不喜欢该合同的条款,那么您应该针对一个质量控制不被严格执行的平台。苹果有他们拒绝使用未记录方法(这些不是API,根据定义)的应用程序的原因。如果您聪明地尝试绕过此限制,他们可能会将您从iPhone开发人员计划中删除,并且他们这样做是正确的。 - NSResponder
首先,我想说我从未打算将Stack Overflow作为表达我对使用私有API观点的平台!如果我想这样做,我会去Slashdot或开发者论坛。我无法理解为什么人们会对出于兴趣提出诚实问题并希望学习某些东西感到不满,或者为什么有些人似乎认为某些任意选择的话题应该突然成为禁忌和禁止谈论的话题。 - Adam
3个回答

4

为什么要关心这个问题?你不应该使用私有API,因为苹果公司随时可能破坏你的应用程序,从而影响你的用户。

话虽如此,使用NSInvocation、-performSelector:或任何其他类似的技术可能足以避免被静态分析器检测到。


2

我想你已经阅读了这篇文章。还有一篇有趣的文章是这个。我的理解是,苹果公司的静态分析器会因为一些人使用与私有方法同名的方法而产生误报警。如果分析器进行运行时分析或对调用哪些类的选择器进行彻底检查,这种情况就不会发生。因此,它们似乎主要是在您的二进制文件中寻找匹配的字符串或选择器。我认为结合一些字符串混淆使用NSInvocation将帮助您通过检测。但我仍然建议不要依赖私有API。


1

有一个简单的方法来找出答案!

制作一个应用程序,通过您提出的方法故意使用隐藏的API,并查看它是否会被接受!

萨姆

PS:如果您真的找到了答案,请务必告诉我们;我们都很想确切知道,而Apple肯定不会告诉我们!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接