在iOS应用中运行未签名的代码以测试越狱

ric*_*hie 6 jailbreak ios

我需要一种稳定的方法来尝试在iOS设备上运行未签名的可执行文件,以便测试设备是否已越狱(即允许运行未签名的代码).

我写了一个小的可执行文件,基本上什么也没做.

int main(int argc, char *argv[]) {
    return 23;
}
Run Code Online (Sandbox Code Playgroud)

我已经在iOS设备上成功编译并运行(Jailbroken都没有).

然后,我将此可执行文件添加到App捆绑包,并将该应用程序部署到iOS设备.

这导致设备上的可执行文件的只读版本.我试图chmod这个文件给它执行权限,但这失败了,所以我把它复制到应用程序的tmp目录,在那里我能够chmod具有可执行权限.

其他问题建议使用execve来调用可执行文件,但是这将用新的进程替换正在运行的进程,这会终止应用程序.Fork()总是失败,所以这不是一个选项.System()需要一个shell,并且可以在没有shell的情况下进行越狱,这仍然允许未签名的代码运行,所以这样就可以了.Popen()分叉,这样就行不通了.

有趣的是,根据我的发现,在普通设备上调用execv我的可执行文件会导致"不允许操作"错误,而在越狱设备上调用它会导致"权限被拒绝"错误.仅此一项适用于越狱检测,除非发生允许执行execv越狱的情况,然后应用程序将立即崩溃,因为它的进程将被替换.

根据这一点,iBooks执行越狱检测,但它似乎使用fairplayd二进制来执行它的execve调用.

有没有人对运行可执行文件或使用fairplayd有任何建议?

Nat*_*ate 3

您无法直接更改测试可执行文件的权限,因为安装应用程序后无法修改应用程序资源。那将是一个安全漏洞。因此,这就是为什么您需要将其复制到 tmp/caches/documents 目录,然后使其可运行。

我不确定您的应用程序是否需要支持多任务处理,以及您是否需要在第一次运行开始时检测越狱,或者是否可以等到应用程序关闭。但是,如果您可以关闭多任务处理,那么您可以实现此方法(test本例中命名的小可执行文件):

- (void)applicationWillTerminate:(UIApplication *)application {
    NSString* path = [NSTemporaryDirectory() stringByAppendingPathComponent: @"test"];
    int result = execlp([path UTF8String], [path UTF8String], NULL);
    // if we got here, then the attempt to run the external process failed, so make a note of this:
    [[NSUserDefaults standardUserDefaults] setValue: [NSNumber numberWithBool: NO] forKey: @"is_jailbroken"];
    NSLog(@"test returns %d", result);
}
Run Code Online (Sandbox Code Playgroud)

如果execlp()调用成功,那么是的,你的进程将被替换。但是,无论如何,该过程即将关闭。当我这样做时,我没有看到实际的崩溃日志,所以我不确定苹果是否会抱怨这一点。用户不会出现崩溃的情况。

如果您无法执行单独的进程,那么您的应用程序将继续执行允许您记录手机显然未越狱这一事实的代码行,这可以在您的应用程序下次启动时注意到。

如果您确实需要支持多任务处理,那么您可以尝试将上述代码放入多任务回调中,例如applicationDidEnterBackground:. 如果手机正常,则 exec 调用失败(并返回),因此您的应用程序不会终止(退出)。我假设(?)Apple 审核人员不会在越狱手机上测试您的应用程序。对于那些手机越狱的人,您的应用程序将退出,而不是进入后台。也许这足以满足您的需求?

另外,仅供参考,还有其他方法来测试越狱系统,这些方法可能非常可靠(我不确定您是否希望能够 100% 检测到越狱手机,或者检测标准越狱配置)

以编程方式确定 iPhone 是否越狱

如何检测 iOS 应用程序正在越狱手机上运行?