web-dev-qa-db-ja.com

アプリがジェイルブレイクされたデバイスで実行されていることを検出する方法は?

IOS用のアプリをリリースしましたが、脱獄者がアプリを使用しないようにする方法がわかりません。

ジェイルブレイクされたデバイスでアプリが動作しないようにするために何かできますか?

49
R. Dewi

アプリが刑務所で壊れたデバイスで実行されているかどうかをコードで検出できます。その方法で、アラートをポップアップしてアプリを閉じることができます。やりたいことは何でもできます。チュートリアルは次のとおりです。

http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html

そして、これがStack Overflowの投稿です:

ジェイルブレイクした携帯電話でiOSアプリが実行されていることを検出するにはどうすればよいですか?

また、完全なソリューションが必要な場合は、tapjoy SDKコードで確認できます。彼らはジェイルブレイクしたiPhoneを検出しています。これがtapjoy URLです https://www.tapjoy.com/

49
Rahul Vyas

これらのパスを確認してください

+ (BOOL)isJailBroken {
#ifdef TARGET_IPHONE_SIMULATOR
    return NO;
#endif

    NSArray *paths = @[@"/bin/bash",
                       @"/usr/sbin/sshd",
                       @"/etc/apt",
                       @"/private/var/lib/apt/",
                       @"/Applications/Cydia.app",
                       ];

    for (NSString *path in paths) {
        if ([self fileExistsAtPath:path]) {
            return YES;
        }
    }

    return NO;
}


+ (BOOL)fileExistsAtPath:(NSString *)path {
    FILE *pFile;
    pFile = fopen([path cStringUsingEncoding:[NSString defaultCStringEncoding]], "r");
    if (pFile == NULL) {
        return NO;
    }
    else
        fclose(pFile);
    return YES;
}

さらに、見てみることができます https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignalSDK/Source/OneSignalJailbreakDetection.m

6
onmyway133

Cydiaまたはジェイルブレイクされたデバイスが作成するファイルを見つけてください。または、アプリのブラックボックス外のファイルに書き込もうとします。あなたがそれを成功させると、デバイスは危殆化/ジェイルブレイクされます:)

- (BOOL)jailbroken
{
    NSFileManager * fileManager = [NSFileManager defaultManager];
    return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
5
karim

デバイスがjailBrokenかどうかを検出するには、次をチェックします。

  1. Cydiaがインストールされています
  2. 一部のシステムパスを確認する
  3. サンドボックスの整合性チェックを実行できます
  4. シンボリックリンク検証を実行する
  5. Sandboxの外部でファイルを作成して書き込むかどうかを確認します

オープンソースライブラリ があります。さまざまな記事や書籍から作成しました。試してみてください。

4
user3088680

@karimの答えに基づいて、ここで少し修正したSwiftバージョン:

func hasJailbreak() -> Bool {
    #if Arch(i386) || Arch(x86_64)
        println("Simulator")
        return false    
    #else
        var fileManager = NSFileManager.defaultManager()
        if(fileManager.fileExistsAtPath("/private/var/lib/apt")) {
            println("Jailbroken Device")
            return true
        } else {
            println("Clean Device")
            return false
        }
    #endif
}
4
inVINCEable
-(BOOL) isJailbroken
{
#if TARGET_IPHONE_SIMULATOR
return NO;
#else
FILE *f = fopen("/bin/bash", "r");
if (errno == ENOENT)
{
    // device is NOT jailbroken
    fclose(f);
    NSLog(@"no");
    return NO;
}
else {
    // device IS jailbroken
    fclose(f);
    NSLog(@"yes");
    return YES;

}
#endif
}
4
sinh99

デバイスがジェイルブレイクされている場合でも、ipaアプリケーションは自分のサンドボックスにしかアクセスできないため、デバイスがジェイルブレイクされているかどうかにかかわらず、メソッドはNOを返します:)別の方法を探してくださいアプリストアは問題を引き起こす可能性があります

2
user1846654
/**
     Detect that the app is running on a jailbroken device or not

     - returns: bool value for jailbroken device or not
     */
    public class func isDeviceJailbroken() -> Bool {
        #if Arch(i386) || Arch(x86_64)
            return false
        #else
            let fileManager = FileManager.default

            if (fileManager.fileExists(atPath: "/bin/bash") ||
                fileManager.fileExists(atPath: "/usr/sbin/sshd") ||
                fileManager.fileExists(atPath: "/etc/apt")) ||
                fileManager.fileExists(atPath: "/private/var/lib/apt/") ||
                fileManager.fileExists(atPath: "/Applications/Cydia.app") ||
                fileManager.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib") {
                return true
            } else {
                return false
            }
        #endif
    }
2
CrazyPro007

ジェイルブレイクされたデバイスを見つけるには多くの方法があります。熟練したハッカーがアプリケーションパスを変更した場合、cydia technicのチェックは機能しません。

それを確認する良い方法は、アプリケーションバンドル外の他の場所にあるファイルを変更できるかどうかを確認することです。

NSError *error;
NSString *stringToBeWritten = @"This is a test.";
[stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES
         encoding:NSUTF8StringEncoding error:&error];
if(error==nil){
   //Device is jailbroken
   return YES;
 } else {
   //Device is not jailbroken
   [[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
 }

以下のURLでその他のテクニックを検索してください

http://highaltitudehacks.com/2013/12/17/ios-application-security-part-24-jailbreak-detection-and-evasion/

1
Boobalan

デバイスがジェイルブレイクされたかどうかを検出する方法はありません。

たとえあったとしても、デバイスはすでにジェイルブレイクされており、任意のコードの実行が可能であり、ジェイルブレイカーは、デバイスがジェイルブレイクされていないことを通知するために使用する検出方法を変更することを考慮してください。

参照: https://forums.developer.Apple.com/thread/4307

クレジットAppleこの同じ質問に回答したスタッフ

1
igrek

スウィフト3:

func hasJailbreak() -> Bool {
        #if Arch(i386) || Arch(x86_64)
            print("Simulator")
            return false
        #else
            return FileManager.default.fileExistsAtPath("/private/var/lib/apt")
        #endif
    }
1
Maksim Kniazev