iPhone静态代码分析器
-
06-07-2019 - |
题
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如何使用程序集上的静态代码分析检测到这一点?
有几点:
- 我知道方法名称会 作为静态存储在二进制文件中 串。然而,这将是微不足道的 生成方法名称 运行时以及使用 stringWithFormat:或其他类型的 轻微的混淆(足够 混淆静态分析仪)。
- 我知道即使是使用gdb的最琐碎的运行时分析也会揭示这个技巧 - 我的理解是Apple分析了二进制文件本身,也许我对此完全错了。 醇>
解决方案
为何关心?您不应该使用私有API有充分理由:Apple可能会随时轻易破坏您的应用程序,从而使您的用户感到不安。
也就是说,使用NSInvocation,-performSelector:或任何其他类似的技术可能足以避免静态分析器的检测。
其他提示
有一种简单的方法可以找到答案!
制作一个应用程序,通过您问题中的方法故意使用隐藏的api,如果被接受,请查看它!
萨姆
PS如果你确实发现了,请务必告诉我们;我们都很想知道,Apple肯定不会告诉我们!
不隶属于 StackOverflow