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


109

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

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


更改标题-我想你的意思是“苹果怎么知道..”
Anurag 2010年

Answers:


173

我知道3种方式。这些只是一些推测,因为我不在Apple审核小组工作。

1。 otool -L

这将列出应用程序已链接到的所有库。显然,您不应该使用的东西(例如IOKit和WebKit)可以被检测到。

2。 nm -u

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

  • 未记录的C函数,例如_UIImageWithName;
  • Objective-C类,例如UIProgressHUD
  • Ivars,例如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_msg发送
  • -valueForKey:; object_getInstanceVariable,object_getIvar等。

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


好答案。我要补充一点,如果您的应用程序在执行某些操作而又不使用私有API的情况下极其困难,那么我敢肯定您的应用程序会受到更多的审查。
马修·弗雷德里克

我对调用私有方法的解决方法感到好奇。我认为编译器将为[foo privateMethod]生成对objc_msgSend(foo,@selector(privateMethod))的调用,因此,如果Apple可以检测到privateMethod的直接调用,他们还可以通过objc_msgSend(或performSelector :)检测到间接调用。
an0

我想知道为什么您说不应该链接IOKit和WebKit?
hjaltij 2011年

2
您对otool执行什么操作?.app文件?
罗布

1
@Eric,他们可以,尽管这样的工具化版本可能会影响性能。无论如何,看到私有API反复进入App Store,很明显,它们没有这样做,或者至少不是一直如此。
Nate

26

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

+ 1,@罗伯特·戴蒙德(Robert Diamond),您能以同样的方式描述更多吗?我需要检查Google分析是否使用UDID调用。谢谢
Mangesh

13

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

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

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


user1203764 评论说实际上可以检测到此类呼叫
Rup

@Rup想在这里问我关于使用valueForKey的问题吗?stackoverflow.com/questions/11923597/...
丹Rosenstark

1
@Yar有趣的问题!但是我还没有足够的专家来对不起我。Farcaller所说的话对我来说似乎很合理
Rup

感谢@Rup,显然没有足够的专家来从事这一领域的工作:)
Dan Rosenstark 2012年

我认识的人说他刚接到App Store这样的电话。
bugloaf

7

我想他们会查看您的二进制文件试图导入的所有符号(信息无疑会在其符号表中轻松获得),并在它们的“私有API列表”中找到任何这些符号。实际上,它很容易实现自动化。


1
实际上,根据我所知道的私有API使用情况,我可以肯定地说不是这种情况(至少不是全部)。如果这是需要所有,私有API的使用不会滑倒通过。我的经验表明,KennyTM的答案几乎可以肯定是正确的。这是目标C比其它语言,如C.根本不同的区域
内特

1

可执行文件并非完全是一个黑匣子。如果您呼叫图书馆,这很容易找到。这就是为什么我对现代CS教育中汇编语言的缺失感到遗憾。=] ldd之类的工具会告诉您您已链接的内容,尽管我不记得ldd化为Mac iPhone开发工具包的原因。


1
我经常想知道:是否要编写二进制文件进行自我修改,仅在满足某些条件(例如,在应用程序的发布日期之后)后生成代码以导入私有API,Apple是否会捕获它。他们肯定会向我们报告一些有趣的统计数据,例如在越狱手机上运行的游戏数量。
Sniggerfardimungus

@ user30997,特权代码可能只能通过系统调用来访问;执行线程将切换为更高的特权,并检查先前的特权是否具有执行代码的权限。虽然这只是一个例子,还有其他方法可以实现,但是我高度怀疑开发人员是否天真地忽略了这样的基本运行时特权检查机制,该机制肯定已经公开了。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 2010年


1

除了符号调查外...

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


那还不够,因为程序只能在将来的任意时间调用此私有调用,这取决于其他逻辑。要进行此检查,Apple实际上必须完全阻止私有API,或者让框架自动向Apple报告私有API调用-这会严重损害性能。
Motti Shneor '16

0

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

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

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


4
在遇到任何不确定性时了解苹果的审查程序涉及为最大的怪异而掷出一组骰子。
只是我的正确观点

0

此桌面应用程序App Scanner可以通过拆开Mach-O Binary文件来扫描.app文件以查看私人api使用情况。如果可以,那么苹果也可以!


0

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

  • nm -列出目标文件中的符号
  • objdump -显示目标文件中的信息。
  • otool-查看Mach-O [关于]可执行文件的内容
  • strings -这将带给您所有的琴弦。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.