我向Apple提交了一个没有任何源代码的二进制文件。
除了手动检查源代码外,Apple如何知道使用了什么以及您调用了哪些API?
答案 0 :(得分:167)
我知道有三种方法。这些只是一些猜测,因为我不在Apple审核小组工作。
otool -L
这将列出应用已链接到的所有库。显然你不应该使用像IOKit和WebKit这样的东西。
nm -u
这将列出所有链接的符号。这可以检测到
UITouch._phase
(可能是rejection of Three20-based apps过去几个月的原因。)strings
Objective-C选择器存储在二进制文件的特殊区域中,因此Apple可以从那里提取内容,并检查是否使用了一些未记录的Objective-C方法,例如-[UIDevice setOrientation:]
。< / p>
由于选择器独立于您正在发送消息的类,即使您的自定义类定义与UIDevice无关的-setOrientation:
,也有可能被拒绝。
您可以使用Erica Sadun's APIKit来检测由于(错误警报)私有API而导致的潜在拒绝。
(如果你真的真的想要解决这些检查,你可以使用运行时功能,如
-valueForKey:
; object_getInstanceVariable,object_getIvar等获取那些私有库,类,方法和ivars。 )
答案 1 :(得分:26)
您可以使用终端中的以下单行程序列出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/,$_))))))'
答案 2 :(得分:12)
假设你想使用一些私有API; objective C允许您从字符串构造任何SEL:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
机器人或图书馆扫描怎么能抓住这个?他们必须使用一些在运行时监视私有访问的工具来捕获它。即使他们构造了这样的运行时工具,也很难捕获,因为这个调用可能隐藏在一些很少运行的路径中。
答案 3 :(得分:7)
我想他们会查看你的二进制文件试图导入的所有符号(毫无疑问,在其符号表中可以轻松获得信息)并且如果在“私有API列表”中找到任何这些符号,则将其命名。事实上,很容易实现自动化。
答案 4 :(得分:1)
可执行文件不完全是黑盒子。如果你打电话给图书馆,这很容易找到。这就是我为现代CS教育中失去汇编语言而感到遗憾的原因。 =]像ldd这样的工具会告诉你你已经链接了什么,虽然我不记得ldd是什么化身为mac iPhone开发工具包。
答案 5 :(得分:1)
otool -L somebinary
答案 6 :(得分:1)
除了符号调查......
apple可以很容易地拥有一个版本的sdk,它在调用时检查每个私有方法堆栈,以确保它是从一个指定的方法输入的。
答案 7 :(得分:0)
即使您是静态链接,最糟糕的是,他们可以从列表中的私有API中获取代码样本,并针对它们搜索二进制文件(也相对容易实现自动化)。
了解Apple,我敢打赌他们拥有一个全面的自动化系统,任何不确定性都可能被拒绝或手动审核。
一天结束时,我认为尝试愚弄Apple可能不值得。
答案 8 :(得分:0)
此桌面应用程序App Scanner可以通过拆分Mach-O二进制文件来扫描.app文件以获取私有api用法。如果可以,那么苹果也可以!
答案 9 :(得分:0)
有很多用于逆向工程的工具,可以用来检查代码
nm
-列出目标文件objfile中的符号objdump
-显示目标文件中的信息。otool
-查看Mach-O可执行文件的内容strings
-这将为您提供所有字符串。您可以找到示例here