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