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运行时分析也会揭示这个技巧——我的理解是苹果分析的是二进制文件本身,也许我完全错了。