我向 Apple 提交了一个没有任何源代码的二进制文件。
除了手动检查源代码之外,Apple 如何知道使用了什么以及您调用了哪些 API?
我向 Apple 提交了一个没有任何源代码的二进制文件。
除了手动检查源代码之外,Apple 如何知道使用了什么以及您调用了哪些 API?
我知道有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。)
您可以在终端中使用以下单行列出 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 ...];
机器人或图书馆扫描如何捕捉到这一点?他们将不得不使用一些在运行时监控私有访问的工具来捕捉这一点。即使他们构建了这样一个运行时工具,也很难捕捉到,因为这个调用可能隐藏在一些很少使用的路径中。
我想他们会查看您的二进制文件尝试导入的所有符号(信息无疑很容易在其符号表中提供给他们),如果在他们的“私有 API 列表”中找到任何这些符号,他们就会告诉您。事实上,很容易实现自动化。
otool -L somebinary
可执行文件并不完全是一个黑匣子。如果你打电话给图书馆,很容易找到。这就是为什么我哀叹现代计算机科学教育中失去汇编语言的原因。=] ldd 之类的工具会告诉您链接的内容,尽管我不记得 ldd 的什么化身使它成为 mac iPhone 开发工具包。
除了符号调查...
苹果可以很容易地拥有一个 sdk 版本,该版本在调用时检查每个私有方法堆栈,以确保它是从指定方法之一输入的。
这个桌面应用程序App Scanner可以通过分离 Mach-O 二进制文件来扫描 .app 文件以供私有 api 使用。如果可以,那么苹果也可以!
即使您是静态链接,在最坏的情况下,他们也可以从其列表中的私有 API 中获取代码样本,并针对它们搜索您的二进制文件(也相对容易自动化)。
了解 Apple,我敢打赌他们有一个全面的自动化系统,任何不确定性都可能被拒绝或手动审查。
归根结底,我认为试图愚弄苹果可能不值得。
有很多用于逆向工程的工具可以检查代码
nm
- 列出目标文件中的符号 objdump
- 显示来自目标文件的信息。otool
- 查看 Mach-O [关于]可执行文件的内容strings
- 这将为您提供所有字符串。您可以在Objective-C和Swift的要点中找到使用这些命令的示例/表示