【发布时间】:2012-08-26 03:32:07
【问题描述】:
我需要一种稳定的方法来尝试在 iOS 设备上运行未签名的可执行文件,以测试设备是否已越狱(即允许运行未签名的代码)。
我已经编写了一个基本上什么都不做的小型可执行文件。
int main(int argc, char *argv[]) {
return 23;
}
我已经在 iOS 设备上编译并成功运行(越狱和未越狱)。
然后,我将此可执行文件添加到 App 捆绑包中,并将该应用程序部署到 iOS 设备。
这会在设备上生成只读版本的可执行文件。我试图 chmod 这个文件以赋予它执行权限,但是失败了,所以我将它复制到应用程序的 tmp 目录中,在那里我可以使用可执行权限进行 chmod。
其他问题建议使用 execve 调用可执行文件,但这会将正在运行的进程替换为新进程,这将杀死应用程序。 Fork() 总是失败,所以这不是一个选项。 System() 需要一个外壳程序,并且可以在没有外壳程序的情况下进行越狱,它仍然允许未签名的代码运行,所以它已经过时了。 Popen() 分叉,所以这行不通。
有趣的是,根据我的发现,在普通设备上对我的可执行文件调用 execv 会导致“不允许操作”错误,而在越狱设备上调用它会导致“权限被拒绝”错误。仅此一项就可以进行越狱检测,除非发生越狱而允许 execv 继续进行的情况下,应用程序将立即崩溃,因为它的进程将被替换。
根据this,iBooks 会执行越狱检测,但它似乎使用 fairplayd 二进制文件来执行它的 execve 调用。
有人对运行可执行文件或使用 fairplayd 有任何建议吗?
【问题讨论】: