当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Apple如何知道您正在使用私有API?》经验,为你挑选了4个好方法。

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

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



1> kennytm..:

我知道有三种方法.这些只是一些猜测,因为我不在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_msgSend

-valueForKey:; object_getInstanceVariable,object_getIvar等.

获得那些私有库,类,方法和ivars.)


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

2> Robert Diamo..:

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



3> 小智..:

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

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

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



4> Alex Martell..:

我想他们会查看你的二进制文件试图导入的所有符号(毫无疑问,这些符号在符号表中很容易获得),并且如果在"私有API列表"中找到任何这些符号,则会命令你.事实上,很容易实现自动化.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有