iPhone静态代码分析器

iPhone静态代码分析器,iphone,objective-c,cocoa-touch,static-analysis,Iphone,Objective C,Cocoa Touch,Static Analysis,iPhone开发者社区的一个共识是,苹果最近开始使用静态代码分析工具来检测未记录API调用的使用情况 为了便于讨论,我想知道是否可以通过在运行时生成如下调用来绕过此工具: NSString *const aMethod = @"doStuff:withStuff:"; SEL aSelector = NSSelectorFromString(aMethod); NSMethodSignature *aSignature = [targetObject methodSignatureForSele

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];
这似乎太容易了,所以我想知道——我错过了什么?苹果如何可能通过对程序集进行静态代码分析来检测这种情况

有两点:

  • 我知道方法名将 以静态形式存储在二进制文件中 一串然而,这将是微不足道的 要在以下位置生成方法名: 运行时以及使用 stringWithFormat:或其他类型的 轻微的混淆(足以 混淆静态分析器)
  • 我知道,即使是使用gdb进行的最简单的运行时分析也会揭示这个技巧——我的理解是,苹果分析二进制文件本身,也许我完全错了

  • 有一个简单的方法可以找到

    制作一个通过你问题中的方法故意使用隐藏api的应用程序,看看它是否被接受

    萨姆


    PS如果你发现了,一定要告诉我们;我们都想知道,苹果肯定不会告诉我们

    为什么要在意?你不应该使用私有API有一个很好的理由:苹果可以随时轻易地破坏你的应用程序,让你的用户感到不安


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

    我想您已经阅读了。同样有趣的是。我的解释是,苹果的静态分析器确实会产生误报,只是因为有些人使用与私有方法同名的方法。如果分析器对调用了哪些类的选择器进行了运行时分析或彻底检查,则不会发生这种情况。所以,看起来他们主要是在二进制文件中寻找匹配的字符串或选择器。我认为使用
    NSInvocation
    并结合一些字符串模糊处理将使您顺利通过。不过,我还是建议不要依赖私有API。

    iPhone SDK和开发工具是根据合同授权给您的。如果您不喜欢该合同的条款,那么您应该瞄准一个不重视质量控制的平台。苹果有理由拒绝使用未记录方法的应用程序(根据定义,这些方法不是API)。如果你变得可爱,并尝试这样做一个结束运行,他们可以直接将你从iPhone开发者程序中删除,他们这样做是正确的。首先,我想说的是,我从来没有打算使用堆栈溢出作为一个平台来表达我对使用私有API的意见!如果我想这样做,我会去Slashdot或开发者论坛。我无法理解为什么人们出于对这件事的兴趣而提出一个诚实的问题,并希望了解一些东西,或者为什么有些人似乎认为一些随意选择的话题应该突然成为禁忌和禁止谈论的话题。