我向Apple提交了一个没有任何源代码的二进制文件.
除了手动检查源代码外,Apple如何知道使用了什么以及您调用了哪些API?
我知道有三种方法.这些只是一些猜测,因为我不在Apple审核小组工作.
otool -L
这将列出应用已链接到的所有库.你不应该使用的东西,比如IOKit和WebKit都可以被这个检测到.
nm -u
这将列出所有链接的符号.这可以检测到
未记载的C函数,例如_UIImageWithName;
Objective-C类,如UIProgressHUD
像这样的Ivars UITouch._phase
(这可能是几个月来拒绝基于Three20的应用程序的原因.)
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.)
您可以在终端中使用以下单行程列出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; objective C允许您从字符串构造任何SEL:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\ @"%@%@%@", "se","tOr","ientation:"]); [UIDevice performSelector:my_sel ...];
机器人或图书馆扫描怎么能抓住这个?他们必须使用一些在运行时监视私有访问的工具来捕获它.即使他们构造了这样的运行时工具,也很难捕获,因为这个调用可能隐藏在一些很少运行的路径中.
我想他们会查看你的二进制文件试图导入的所有符号(毫无疑问,这些符号在符号表中很容易获得),并且如果在"私有API列表"中找到任何这些符号,则会命令你.事实上,很容易实现自动化.