我正试图在Reveal之后的this guide上检查iOS 8.1的 Apple日历(MobileCal.app
)。
为此,我正在注入libReveal.dylib
,它会启动OS X Reveal应用程序连接到的自己的HTTP服务器。
这种技术适用于大多数iOS系统应用程序(电话,便笺,提醒等),但日历中的某些内容阻止了HTTP服务器的设置。
运行日历时,libReveal.dylib
已正确注入,但我在日志中看到了这一点:
MobileCal [5110]:错误:启动HTTP Server时出错:错误域= NSPOSIXErrorDomain代码= 1“不允许操作”UserInfo = 0x17426aa40 {NSLocalizedDescription =不允许操作,NSLocalizedFailureReason = bind()函数错误}
MobileCal [5110]:错误:显示服务器无法启动时出错:错误域= NSPOSIXErrorDomain代码= 1“操作不被允许”UserInfo = 0x17426aa40 {NSLocalizedDescription =操作不被允许,NSLocalizedFailureReason = bind()函数中的错误} < / p>
关于什么可以阻止在日历中设置HTTP服务器的想法?我注意到MobileCal.app
包有一个Entitlements.plist
文件,而大多数其他系统应用都没有。这个问题可能与权利文件有关吗?
我也contacted Reveal support,他们有回应,但无法确定导致问题的原因。使用RevealLoader
中的Cydia
会产生相同的结果。
答案 0 :(得分:6)
你对Entitlements.plist
是正确的。问题非常简单 - MobileCal.app
正在使用自定义沙盒配置文件。
iOS中实际上有很多沙箱配置文件,而不仅仅是AppStore应用程序。许多iOS系统组件都使用它们。要知道您需要查看哪个应用程序的权利。更具体地说,seatbelt-profiles
密钥。
MobileCal.app
已使用MobileCal
个人资料签名。这正是您无法使用bind()
的原因。我怀疑所有网络都被阻止了。关于Camera.app
也可以这么说。它使用MobileSlideShow
配置文件,它也阻止所有网络。
我能想到并且实际上使用了两个解决方案来解决这个问题:
编写守护程序。守护进程将执行被沙箱配置文件阻止的所有工作。 App和守护程序将通过某些IPC API(如通知或mach端口)进行通信。这个的主要问题 - 也可以通过沙盒配置文件阻止IPC API。例如,Camera.app
沙箱会阻止可以发送任意数据的所有IPC API。只有达尔文通知工作无法发送任意数据。有办法解决这个问题,但它会非常难看。
在删除沙盒配置文件的情况下重新启动应用。这样,应用程序将可以访问所有内容,您可以在注入的dylib中完成所有工作。这就是我现在使用的,它运作良好。这也是一种破解,但它不需要处理IPC及其复杂性,从而显着改善了代码。对我来说值得。
这一般都是。对于我的情况,我认为只有第二种解决方案才有效。
对于cource来说,仅仅编辑Entitlements.plist
是不够的。实际权利在应用程序的二进制文件中。您可以在Mac或iDevice上重新签名。在Mac上,您可以选择codesign和ldid。在iDevice上,您唯一的选择是ldid。
让我们看一下如何使用ldid解决问题。首先,您使用
转储权利ldid -e MobileCal > entitlements.xml
然后编辑转储的权利并使用
重新签名应用程序二进制文件ldid -Sentitlements.xml MobileCal
(是的,-S
和权利文件之间没有空格。
就是这样。