转载自:
http://www.csdn.net/article/2012-02-10/311678
导读:“我只是提交给了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。)
我猜想他们正在试图导入所有二进制符号(毫无疑问,他们会很容易获得符号表中的信息),并且将这些符号建立在自己的“私有API列表”中。所以事实上,实现自动化,其实很简单。
一个可执行文件不完全是一个黑盒子。如果你调用了一个库,它会很容易的发现。这就是我为什么感叹现代CS教育的汇编语言的损失。
比方说你想要使用一些私有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当然也可以做到!