检测越狱的iOS设备通过运行未签名的可执行文件

5
目前,我正在尝试为公司的开发人员创建一个可重复使用的objC安全库。在这个库中,我想要有一个API来检测他们的iOS设备是否越狱。我注意到了GregH的聪明回答,它类似于iBooks所做的事情;您运行未签名版本的可执行文件(iOS通过execve系统调用在应用程序启动时执行),如果它返回,则知道该设备已越狱。
问题:是否可能在iOS库中打包一个可执行文件并通过某些函数调用它?如果是,最好的方法是什么?
感谢您的帮助, kc
2个回答

2
上次我检查过,沙盒应用程序甚至不能进行fork()操作。我不确定它们是否可以调用execve()函数。如果它们两者都不能做到,那么简单地调用execve()函数应该就可以了。
我不确定越狱对此有多大干扰。可能会有一种越狱方式,让您能够从未签名的应用程序中运行未签名的应用程序,但如果调用者已签名,则正常运行。
很明显可以在库中“打包”可执行文件:只需使用static unsigned char const data [] = { ... };,将其写入文件,chmod(),然后尝试执行它。
不过,总的来说,这可能对您的用户是一种伤害。越狱的手机并不意味着您的应用程序已被盗版。除非您认识一些愿意进行一些测试(并测试不同的越狱)的越狱手机用户,否则您可能会为“它总是崩溃!”的评论而自寻烦恼。
(如果确实崩溃了,那么肯定会有人来破解您的应用程序。更好的做法是悄悄观察“问题”,然后再决定是否需要修复它。)
越狱经常发生。我们在自动崩溃报告符号化脚本中添加了对MobileSubstrate的检查,因为我们看到它在很大一部分崩溃中出现。另一方面,在/Applications中安装应用程序的崩溃比例微不足道(这曾经是盗版应用程序的传统方式;也许现在已经不再是了)。

execve() 而言,无论函数是否正常运行,调用该函数可能会触发苹果的“不支持/未记录的 API”检测器,并导致您的应用被拒绝。 - user149341
@duskwuff:如果它在头文件中,那么它已经被“记录”得足够好了,不会触发检测器。据我所知,标头恰好是其自动系统用来决定某些东西是否“公共”的依据。 - tc.

0
我尝试通过将一个包含 main() 函数返回整数的项目中的可执行文件添加到我的项目中,将可执行文件打包在 IOS 应用程序中。 这个文件在部署时被复制到手机上,但是复制时没有赋予执行权限。 试图使用 chmod 赋予可执行文件执行权限会导致“操作不允许”错误,尽管文件所有者与当前用户相同(mobile)。

如果你将可执行文件复制到NSCachesDirectory中,你可以对其进行chmod。 - richie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接