无法绑定()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
已使用MobileCal
configuration文件签名。 这正是你不能使用bind()
。 我怀疑所有的networking都被阻塞了。 Camera.app
也可以Camera.app
说。 它使用MobileSlideShow
configuration文件也阻止所有networking。
我可以想到,实际上使用了两个解决scheme来解决这个问题:
-
编写一个守护进程。 守护程序将执行所有被沙箱configuration文件阻止的工作。 应用程序和守护进程将通过一些IPC API(如通知或机器端口)进行通信。 与此主要问题 – IPC API也可能被沙箱configuration文件阻止。 例如,
Camera.app
沙盒会阻止所有可以发送任意数据的IPC API。 只有达尔文通知工作,不能发送任意的数据。 有办法解决这个问题,但这将是非常丑陋的。 -
辞去沙箱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
和授权文件之间没有空格)。
而已。