无法绑定()Apple日历中的套接字(dylib注入)

我试图按照本指南检查iOS 8.1的Apple日历MobileCal.app )。

为此,我正在注入libReveal.dylib ,它启动了OS X Reveal应用程序连接到的自己的HTTP服务器。

这项技术适用于大多数iOS系统应用程序(手机,笔记,提醒等),但日历中的某些内容阻止了HTTP服务器的设置。

当日历运行时, libReveal.dylib被正确注入,但是我在日志中看到:

MobileCal [5110]:错误:启动HTTP服务器时出错:错误域= NSPOSIXErrorDomain代码= 1“操作不允许”UserInfo = 0x17426aa40 {NSLocalizedDescription =不允许的操作,NSLocalizedFailureReason = bind()函数中的错误}

MobileCal [5110]:错误:显示服务器无法启动的错误:错误域= NSPOSIXErrorDomain代码= 1“不允许的操作”UserInfo = 0x17426aa40 {NSLocalizedDescription =不允许的操作,NSLocalizedFailureReason =在bind()函数中的错误}

关于什么可以阻止在日历中设置HTTP服务器的任何想法? 我注意到, MobileCal.app包有一个Entitlements.plist文件,而大多数其他系统应用程序不。 这个问题可能与权利文件有关吗?


我还联系了Reveal的支持 ,他们很敏感,但是不能确定是什么原因造成的。 使用来自Cydia RevealLoader产生相同的结果。

你对Entitlements.plist是正确的。 问题很简单 – MobileCal.app使用自定义沙盒configuration文件。

实际上iOS中有许多沙盒configuration文件,而不仅仅是AppStore应用程序。 许多iOS系统组件都使用它们。 要知道哪一个你需要看应用程序的权利。 更具体地说, seatbelt-profiles关键。

MobileCal.app已使用MobileCalconfiguration文件签名。 这正是你不能使用bind() 。 我怀疑所有的networking都被阻塞了。 Camera.app也可以Camera.app说。 它使用MobileSlideShowconfiguration文件也阻止所有networking。

我可以想到,实际上使用了两个解决scheme来解决这个问题:

  1. 编写一个守护进程。 守护程序将执行所有被沙箱configuration文件阻止的工作。 应用程序和守护进程将通过一些IPC API(如通知或机器端口)进行通信。 与此主要问题 – IPC API也可能被沙箱configuration文件阻止。 例如, Camera.app沙盒会阻止所有可以发送任意数据的IPC API。 只有达尔文通知工作,不能发送任意的数据。 有办法解决这个问题,但这将是非常丑陋的。

  2. 辞去沙箱configuration文件的应用程序。 这样的应用程序将有权访问的一切,你可以做你的注入的dylib内的所有工作。 这是我现在使用的,它工作得很好。 这也是一种破解,但是它不需要处理IPC而是显着提高了代码的复杂性。 对我来说这是值得的。

这一切都是一般的。 对于你我的情况,我认为只有第二个解决scheme将工作。

只要编辑Entitlements.plist是不够的。 实际的权利是在应用程序的二进制本身。 你可以在你的Mac或者iDevice上签字。 在Mac上,您可以selectcodesign和ldid 。 在iDevice上,你唯一的select是ldid。

我们来看看如何用ldid解决你的问题。 首先,您使用权限转储

 ldid -e MobileCal > entitlements.xml 

然后你编辑倾销的权利,并辞去应用程序的二进制文件

 ldid -Sentitlements.xml MobileCal 

(是的,在-S和授权文件之间没有空格)。

而已。