繁体   English   中英

Apple 如何知道您使用的是私有 API?

[英]How does Apple know you are using private API?

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

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

我知道有3种方法。 这些只是一些猜测,因为我不在 Apple 审查团队工作。

1. otool -L

这将列出应用程序链接到的所有库。 显然你不应该使用的东西,比如 IOKit 和 WebKit 可以通过这个检测到。

2. nm -u

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

  • 未公开的 C 函数,例如 _UIImageWithName;
  • Objective-C 类,例如 UIProgressHUD
  • 诸如UITouch._phase类的UITouch._phase (这可能是最近几个月 基于 Three20 的应用程序拒绝的原因。)

3. 列出 Objective-C 选择器或strings

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

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


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


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

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

获取那些私有库、类、方法和变量。 )

您可以在终端中使用以下单行代码在 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/,$_))))))'

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

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

机器人或图书馆扫描如何捕捉到这一点? 他们将不得不使用一些在运行时监控私有访问的工具来捕捉这一点。 即使他们构建了这样一个运行时工具,也很难捕捉到,因为这个调用可能隐藏在一些很少被执行的路径中。

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

除了符号调查...

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

可执行文件并不完全是一个黑匣子。 如果你打电话到图书馆,很容易找到。 这就是为什么我对现代 CS 教育中汇编语言的丢失感到遗憾。 =] ldd 之类的工具会告诉您链接的内容,尽管我不记得 ldd 的哪个版本使它成为 mac iPhone 开发工具包。

otool -L somebinary

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

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

归根结底,我认为尝试愚弄 Apple 可能不值得。

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

有很多逆向工程工具可以检查代码

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

您可以在Objective-CSwift 的要点中找到使用这些命令的示例/表示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM