Apple如何知道你用私有API?

来源:互联网 发布:算法描述的发展现状 编辑:程序博客网 时间:2024/06/07 05:21

导读:“我只是提交给了Apple二进制文件,我没有提交给Apple任何的源代码,且不说被“您”使用人工审查。Apple是如何知道“您”正在使用私有API?Apple是如何知道的呢?”这是一位名叫Anurag协作编辑在stackoverflow网站上提出的问题,以下是一些专业人士和程序员爱好者就以上问题的回答。

1.KennyTM

因为我没有在苹果审查小组工作过,以下只是我猜测的三种方式:

1)otool -L

将应用程序的名单链接到所有的库中,清楚您不应该使用的,像IOKit和WebKit就可以通过这个库可以检测出来。

2)nm -u

列出所有的应用程序链接符号。你可以检测到:

  • 无证C函数,如:UIImageWithName;
  • Objective-C类,如:UIProgressHUD;
  • Ivars类,如:UITouch._phase(这可能就是前几个月拒绝其基于Three20应用程序的原因。)

3)Objective-C选择器位置,或者串

Objective-C选择器是存储二进制的一个特殊区域。所以,Apple可以从那里提取内容,并且进行检测你是否使用了一些无证的Objective-C的方法,如-[UIDevice setOrientation:]。

由于选择器是你的信息的单独类,所以即使您的自定义类的定义setOrientation:UIDevice无关,这将会是被拒绝的可能性。

你还可以使用Erica Sadun’s APIKit去检测是否由于(误报)潜在拒绝私有API。

(如果你是真的想要这些检查的解决办法,你可以使用运行库等功能:

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey:; object_getInstanceVariable, object_getIvar, etc.

去得到私有库、类、方法和ivars。)

2.Alex Martelli

我猜想他们正在试图导入所有二进制符号(毫无疑问,他们会很容易获得符号表中的信息),并且将这些符号建立在自己的“私有API列表”中。所以事实上,实现自动化,其实很简单。

3.user30997

一个可执行文件不完全是一个黑盒子。如果你调用了一个库,它会很容易的发现。这就是我为什么感叹现代CS教育的汇编语言的损失。

4.Chris McLuvin

比方说你想要使用一些私有API;objective C允许你从一个字符串构造任何的SEL:

SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\ @"%@%@%@", "se","tOr","ientation:"]); [UIDevice performSelector:my_sel ...];

如何能让机器人或者库赶上扫描?他们将不得不使用一些私人访问时运行监视的工具。即使他们构造这样一个运行工具,但是它还是很难赶上,因为这个调用可能隐藏在一些很少行驶的路径中。

5.wash

即使你是静态链接,最坏也就是,他们从他们的私有API名单中抽取样本代码,对他们的二进制进行搜索(相对来说容易实现自动化)。

对于Apple的了解,我敢打赌,他们有一个全面的、自动化系统,任何不确定性的可能都会被拒绝或者被人工审查。

6.Andrew

他们的桌面应用程序App Scanner,可以通过拉开Mach-O二进制文件扫描为私有API使用的.app文件。更何况,如果你可以做到的话,那么Apple当然也可以做到!

1 0