Apple如何知道您正在使用私有API?

时间:2010-05-16 02:05:04

标签: iphone objective-c appstore-approval

我向Apple提交了一个没有任何源代码的二进制文件。

除了手动检查源代码外,Apple如何知道使用了什么以及您调用了哪些API?

10 个答案:

答案 0 :(得分:167)

我知道有三种方法。这些只是一些猜测,因为我不在Apple审核小组工作。

1。 otool -L

这将列出应用已链接到的所有库。显然你不应该使用像IOKit和WebKit这样的东西。

2。 nm -u

这将列出所有链接的符号。这可以检测到

  • 未记录的C函数,例如_UIImageWithName;
  • Objective-C类,如UIProgressHUD
  • Ivars,例如UITouch._phase(可能是rejection of Three20-based apps过去几个月的原因。)

3。列出Objective-C选择器,或strings

Objective-C选择器存储在二进制文件的特殊区域中,因此Apple可以从那里提取内容,并检查是否使用了一些未记录的Objective-C方法,例如-[UIDevice setOrientation:]。< / p>

由于选择器独立于您正在发送消息的类,即使您的自定义类定义与UIDevice无关的-setOrientation:,也有可能被拒绝。


您可以使用Erica Sadun's APIKit来检测由于(错误警报)私有API而导致的潜在拒绝。


(如果你真的真的想要解决这些检查,你可以使用运行时功能,如

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

获取那些私有库,类,方法和ivars。 )

答案 1 :(得分:26)

您可以使用终端中的以下单行程序列出Mach-O程序中的选择器:

otool -s __TEXT __objc_methname "$1" |expand -8 | cut -c17- | sed -n '3,$p' | perl -n -e 'print join("\n",split(/\x00/,scalar reverse (reverse unpack("(a4)*",pack("(H8)*",split(/\s/,$_))))))'

答案 2 :(得分:12)

假设你想使用一些私有API; objective C允许您从字符串构造任何SEL:

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

机器人或图书馆扫描怎么能抓住这个?他们必须使用一些在运行时监视私有访问的工具来捕获它。即使他们构造了这样的运行时工具,也很难捕获,因为这个调用可能隐藏在一些很少运行的路径中。

答案 3 :(得分:7)

我想他们会查看你的二进制文件试图导入的所有符号(毫无疑问,在其符号表中可以轻松获得信息)并且如果在“私有API列表”中找到任何这些符号,则将其命名。事实上,很容易实现自动化。

答案 4 :(得分:1)

可执行文件不完全是黑盒子。如果你打电话给图书馆,这很容易找到。这就是我为现代CS教育中失去汇编语言而感到遗憾的原因。 =]像ldd这样的工具会告诉你你已经链接了什么,虽然我不记得ldd是什么化身为mac iPhone开发工具包。

答案 5 :(得分:1)

otool -L somebinary

答案 6 :(得分:1)

除了符号调查......

apple可以很容易地拥有一个版本的sdk,它在调用时检查每个私有方法堆栈,以确保它是从一个指定的方法输入的。

答案 7 :(得分:0)

即使您是静态链接,最糟糕的是,他们可以从列表中的私有API中获取代码样本,并针对它们搜索二进制文件(也相对容易实现自动化)。

了解Apple,我敢打赌他们拥有一个全面的自动化系统,任何不确定性都可能被拒绝或手动审核。

一天结束时,我认为尝试愚弄Apple可能不值得。

答案 8 :(得分:0)

此桌面应用程序App Scanner可以通过拆分Mach-O二进制文件来扫描.app文件以获取私有api用法。如果可以,那么苹果也可以!

答案 9 :(得分:0)

有很多用于逆向工程的工具,可以用来检查代码

  • nm-列出目标文件objfile中的符号
  • objdump-显示目标文件中的信息。
  • otool-查看Mach-O可执行文件的内容
  • strings-这将为您提供所有字符串。

您可以找到示例here