我向苹果提交了一个没有源代码的二进制文件。
除了手动检查源代码外,苹果如何知道您使用了什么以及调用了哪些API?
我向苹果提交了一个没有源代码的二进制文件。
除了手动检查源代码外,苹果如何知道您使用了什么以及调用了哪些API?
我知道3种方法,但这些只是一些猜测,因为我不在苹果审核团队工作。
otool -L
此命令将列出应用程序链接到的所有库。可以通过此方法检测是否使用了明显不应使用的库,例如 IOKit 和 WebKit。
nm -u
此命令将列出所有链接的符号。可以检测以下内容:
UITouch._phase
(可能是导致最近几个月基于 Three20 的应用程序被拒绝的原因)。strings
Objective-C 选择器存储在二进制文件的特殊区域中,因此 Apple 可以从那里提取内容,并检查您是否使用了一些未经记录的 Objective-C 方法,例如 -[UIDevice setOrientation:]
。
由于选择器与您发送消息的类无关,即使您的自定义类定义了与 UIDevice 无关的 -setOrientation:
,也有可能被拒绝。
您可以使用 Erica Sadun 的 APIKit 来检测由于(误报)私有 API 而导致的潜在拒绝。
(如果您真的真的真的想规避这些检查,可以使用运行时功能,例如
-valueForKey:
; object_getInstanceVariable、object_getIvar 等来获取那些私有库、类、方法和实例变量。)
您可以使用以下一行代码在终端中列出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列表”中,则会对您进行警告。实际上非常容易自动化。
otool -L somebinary
有很多逆向工程工具可以用来检查代码
nm
- 列出目标文件中的符号objdump
- 显示目标文件的信息。otool
- 查看 Mach-O[关于] 可执行文件的内容strings
- 这将获取所有字符串。您可以在 Objective-C 和 Swift 的 gists 中找到使用这些命令的示例/表示