Answers:
我知道3种方式。这些只是一些推测,因为我不在Apple审核小组工作。
otool -L
这将列出应用程序已链接到的所有库。显然,您不应该使用的东西(例如IOKit和WebKit)可以被检测到。
nm -u
这将列出所有链接的符号。这可以检测
UITouch._phase
(这可能是最近几个月拒绝基于Three20的应用程序的原因。)strings
Objective-C选择器存储在二进制文件的特殊区域中,因此Apple可以从那里提取内容,并检查是否使用了一些未公开的Objective-C方法,例如-[UIDevice setOrientation:]
。
由于选择器独立于您要发送消息的类,因此即使您的自定义类定义的内容-setOrientation:
与UIDevice不相关,也有可能被拒绝。
您可以使用Erica Sadun的APIKit来检测由于私有API(错误警报)而引起的潜在拒绝。
(如果您真的很想解决这些检查,则可以使用运行时功能,例如
-valueForKey:
; object_getInstanceVariable,object_getIvar等。获取那些私有库,类,方法和ivars。)
您可以在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/,$_))))))'
假设您要使用一些私有API;目标C允许您从字符串构造任何SEL:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
机器人或图书馆扫描如何捕捉到这一点?他们将不得不使用一些在运行时监视私有访问的工具来捕获此问题。即使他们构建了这样的运行时工具,也很难抓住它,因为此调用可能隐藏在一些很少使用的路径中。
可执行文件并非完全是一个黑匣子。如果您呼叫图书馆,这很容易找到。这就是为什么我对现代CS教育中汇编语言的缺失感到遗憾。=] ldd之类的工具会告诉您您已链接的内容,尽管我不记得ldd化为Mac iPhone开发工具包的原因。
除了符号调查外...
苹果可以很容易地拥有一个sdk版本,该版本可以在调用时检查每个私有方法堆栈,以确保它是从指定方法之一输入的。
此桌面应用程序App Scanner可以通过拆开Mach-O Binary文件来扫描.app文件以查看私人api使用情况。如果可以,那么苹果也可以!
有很多用于逆向工程的工具,它们可以检查代码
nm
-列出目标文件中的符号 objdump
-显示目标文件中的信息。otool
-查看Mach-O [关于]可执行文件的内容strings
-这将带给您所有的琴弦。您可以在Objective-C和Swift的要点中找到使用这些命令的示例/表示形式