Ios 没有越狱检测

Ios 没有越狱检测,ios,objective-c,jailbreak,Ios,Objective C,Jailbreak,我正在尝试制作一个只适用于越狱者的应用程序。我已经有越狱检测代码: ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]);{ UIAlertView *cydiaisinstalled=[[UIAlertView alloc]initWithTitle:@"Cydia is installed!"

我正在尝试制作一个只适用于越狱者的应用程序。我已经有越狱检测代码:

([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]);{
    UIAlertView *cydiaisinstalled=[[UIAlertView alloc]initWithTitle:@"Cydia is installed!"
                                                            message:@"You can use Respring!"
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
    [cydiaisinstalled show];
}}

但是现在我需要能够检测设备是否被越狱。

尝试访问应用程序沙箱之外的任何文件。例如:

BOOL IsDeviceJailbroken(void) {
    #if TARGET_IPHONE_SIMULATOR
    return NO;
    #else
    return [[NSFileManager defaultManager] fileExistsAtPath: @"/bin/bash"];
    #endif
}

请注意,安装Cydia和越狱设备是两件不同的事情。

我编写了一个函数,用于检测设备是否因另一个问题而越狱,但它似乎与此相关:

- (BOOL) isJailbroken() {

    //If the app is running on the simulator
    #if TARGET_IPHONE_SIMULATOR
        return NO;

    //If its running on an actual device
    #else
        BOOL isJailbroken = NO;

        //This line checks for the existence of Cydia
        BOOL cydiaInstalled = [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"];

        FILE *f = fopen("/bin/bash", "r");

        if (!(errno == ENOENT) || cydiaInstalled) {

            //Device is jailbroken
            isJailbroken = YES;
        }            
        fclose(f);
        return isJailbroken;
    #endif
}

此功能使用两项检查来查看手机是否越狱:首先检查是否安装了Cydia。并非所有越狱设备都安装了Cydia,尽管大多数都安装了Cydia,所以我还检查了bash的存在,bash也只出现在越狱设备上。请注意,此函数几乎在所有情况下都能工作,但可能不是100%。唯一在越狱设备上没有Cydia的人可能是那些正在试验越狱设备的人,他们没有使用Cydia来获得诸如调整和主题之类的优势。

好的,谢谢所有的答案,但我是自己发现的。代码如下:

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
    //insert action if cydia is installed
}
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]] == NO) {
    //insert action if Cydia is not installed
}
使用此代码,您可以检测idevice上的任何应用程序,只要该应用程序具有URL方案,您可以在此处找到大部分URL方案:


PS:你必须用你的行动来替换绿色部分:)

对于2021年来到这里的人,这里有一个非常快速的方法来检测你是否越狱,与其他答案不同,这将有利于处理现有的数十种不同越狱:

FILE * filepath = fopen("/var/mobile/test-jb", "w");
    
    if (!filepath) {
        fclose(filepath);
        fprintf(stderr,"Random processes are running sandboxed. Not jailbroken\n");
        return -2;
    }
    
    printf("Detected sandbox escape. This device is likely jailbroken.\n");
    fclose(filepath);
这样做的目的是尝试将测试文件写入
/var/mobile
。如果你是越狱者并且有适当的权利,它通常是有效的。在非越狱设备上,这将在控制台中的
deny()
下失败

确保您使用以下权利签署应用程序:

<key>com.apple.private.security.no-container</key>
    <true/>
<key>platform-application</key>
    <true/>
com.apple.private.security.no-container
平台应用

如果
cydiaInstalled
,是否应
越狱
?你有一个
在<代码>前面,Cydia在你的代码中安装了
。@Nate-谢谢你。我想我只是忽略了这一点,“&&”难道不是一个“| |”吗?我们已经找到Cydia.app@Andreas了,为什么还要检查“/bin/bash”?因为不是所有越狱设备都安装了Cydia。我在回答的最后解释了这一点。但是谢谢-是的,&&应该是一个| |是的,我已经安装了“并非所有设备都安装了Cydia”部件,但是当我们首先检查Cydia并找到它时,没有必要检查“/bin/bash”。只是一个小优化;)如果越狱设备只能在它们身上工作,为什么还要检测它们呢?如果你可以从appstore之后的其他来源安装该应用程序,那么它就是一个越狱设备。只需尝试将任何内容写入/var/mobile即可。如果你不是越狱犯,你就不能越狱。我还想提一下,你的越狱检测是错误的。它只有在安装Cydia的情况下才能工作,而在许多情况下可能不会。我可以列举出至少3次越狱,这些越狱甚至都不是Cydia的,而是Sileo的。相反,您应该尝试在沙箱之外写入/var/mobile。这是普遍的。正如我在回答中所说,打开Cydia并不是检查设备是否越狱的普遍正确的方法,因为不是每个越狱的iDevice都安装了Cydia。但是普通用户hase Cydia:)这是真的,我相信你的目标是这个用户群,因此,为了您的目的,只检查Cydia是可以的。这在iOS 9上总是会失败,因为苹果已经锁定了canOpenURL。您需要在Info.plist中为“cydia”添加一个“LSApplicationQueriesSchemes”条目。@Daniel在iOS9.1中,方案检查似乎失败了,返回-canOpenURL:failed for URL:“cydia://”-error:“此应用程序不允许查询方案cydia”,即使方案在列表中。只要/bin/bash为mobile所有,此项就可以工作(501:501)。如果出于某种原因,它归root(0:0)所有,那么即使在越狱设备上,您也会从沙箱中获得deny();这样,您的检查会显示该文件不存在。启动时,您需要chmod您的二进制文件(6775)并调用setuid(0)和setgid(0),以确保您可以访问该文件,无论该文件的所有者是谁。