我向苹果提交了一个二进制文件,没有任何源代码。
除了手动检查源代码,苹果如何知道使用了什么和你调用了什么 API?
I imagine they look at all symbols your binary's trying to import (info no doubt easily available to them in the symbol table thereof) and ding you if any of those symbols are found in their "private API list". Pretty easy to automate, in fact.
可执行文件并不完全是一个黑盒。如果你去图书馆,很容易找到。这就是为什么我哀叹现代计算机科学教育中汇编语言的缺失。像 ldd 这样的工具会告诉你链接到了什么,尽管我不记得 ldd 是怎么变成 Mac iPhone 开发工具包的了。
即使你是静态链接,最坏的情况下,他们可以从他们列表中的私有 API 中获取代码样本,然后根据它们搜索你的二进制文件(也相对容易自动化)。
了解苹果,我敢打赌他们有一个全面的,自动化的系统,任何不确定性可能被否认或手动审查。
说到底,我认为这可能不值得去试图愚弄苹果。
otool -L somebinary
我知道有三种方法。这些只是一些猜测,因为我不在苹果审查团队工作。
otool -L
This will list all libraries the app has linked to. Something clearly you should not use, like IOKit and WebKit can be detected by this.
nm -u
这将列出所有链接的符号。这可以检测
UITouch._phase
strings
Objective-C 选择器存储在二进制文件的一个特殊区域,因此苹果可以从中提取内容,并检查您是否使用了一些未记录的 Objective-C 方法,比如 -[UIDevice setOrientation:]。
-[UIDevice setOrientation:]
由于选择器独立于要消息传递的类 即使您的自定义类定义了与 UIDdevice 无关的 -setOrientation:,也有可能被拒绝。
-setOrientation:
您可以使用 Erica Sadun's APIKit来检测由于私有 API 的(错误警报)而导致的潜在拒绝。
(如果您真的真的想解决这些检查,您可以使用运行时特性,例如
获取这些私有库、类、方法和 ivar。)
假设您想使用一些私有 API; 目标 C 允许您从字符串构造任何 SEL:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\ @"%@%@%@", "se","tOr","ientation:"]); [UIDevice performSelector:my_sel ...];
机器人或者图书馆怎么可能扫描到这个?他们必须使用一些在运行时监视私有访问的工具来捕捉这个问题。即使他们构造了这样一个运行时工具,也很难捕捉到,因为这个调用可能隐藏在一些很少执行的路径中。
这个桌面应用程序 应用程序扫描器可以扫描。应用程序文件的私人应用程序接口使用通过拉开马赫 -O 二进制文件。如果它可以,那么苹果也可以!
你可以在一个 Mach-O 程序中列出选择器,在 Terminal 中使用以下一行程序:
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/,$_))))))'
除了符号调查。
Apple 可以很容易地拥有 sdk 的一个版本,它在调用时检查每个私有方法堆栈,以确保从指定的方法之一进入。
有很多逆向工程工具可以检查代码
nm
objdump
您可以在 目标 C和 斯威夫特的要点中找到使用这些命令的示例/表示