it-swarm.com.de

Wie kann ich feststellen, dass die App auf einem Gerät mit Jailbreak ausgeführt wird?

Ich habe gerade meine App für iOS veröffentlicht, aber ich bin nicht sicher, wie ich meine App vor Jailbrakern schützen kann. 

Kann ich etwas tun, um zu verhindern, dass meine App auf Geräten mit Jailbreak funktioniert?

47
R. Dewi

Sie können durch Code feststellen, ob die App auf einem Gerät mit defektem Gerät läuft oder nicht. Auf diese Weise können Sie eine Warnmeldung anzeigen und die App schließen. Sie können tun, was Sie wollen. Hier ist ein Tutorial dafür:

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

und hier ist ein Stack Overflow Post:

Wie erkenne ich, dass eine iOS-App auf einem Mobiltelefon mit Jailbreak ausgeführt wird?

Wenn Sie eine vollständige Lösung wünschen, können Sie in tapjoy SDK-Code sehen. Sie entdecken jailbroken iPhone. Hier ist die URL von Tapjoy https://www.tapjoy.com/

46
Rahul Vyas

Überprüfen Sie diese Pfade

+ (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;
}

Außerdem können Sie einen Blick darauf werfen https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignalJailbreakDettection/OneSignalJailbreakDetection.m

6
onmyway133

Versuchen Sie, eine Datei zu finden, die von einem Cydia- oder Jailbroken-Gerät erstellt wird. Oder schreiben Sie in eine Datei außerhalb der Blackbox der App. Wenn das gelingt, ist das Gerät gefährdet/jailbroken :)

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

Basierend auf der Antwort von @ karim gibt es eine leicht modifizierte Swift-Version:

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

Sie können feststellen, ob ein Gerät jailBroken ist oder nicht, indem Sie Folgendes prüfen

  1. Cydia ist installiert
  2. Überprüfen Sie einige der Systempfade
  3. Kann eine Sandbox-Integritätsprüfung durchführen
  4. Symlink-Überprüfung durchführen
  5. Überprüfen Sie, ob Sie Dateien außerhalb Ihrer Sandbox erstellen und schreiben

Es gibt eine Open Source-Bibliothek Ich habe aus verschiedenen Artikeln und Büchern erstellt, probiere es aus. 

3
user3088680

Selbst wenn Ihr Gerät fehlerhaft ist, können ipa-Anwendungen nur auf ihre eigenen Sandboxen zugreifen. Wenn also das Gerät fehlerhaft ist oder nicht, gibt die Methode NEIN zurück:) Zugriff auf eine andere Stelle, aber Ihre Sandbox-Publishing-App im Appstore kann zu Problemen führen

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
    }
1
CrazyPro007

Es gibt viele Möglichkeiten, die Jailbroken-Geräte zu finden. Die Überprüfung der Cydia-Technik wird nicht funktionieren, wenn erfahrene Hacker den Anwendungspfad ändern.

Eine gute Möglichkeit, dies zu überprüfen, wäre zu prüfen, ob wir eine Datei an einem anderen Ort außerhalb des Anwendungspakets ändern können.

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];
 }

Weitere Techniken finden Sie in der folgenden URL

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

0
Boobalan

Es ist nicht möglich zu erkennen, ob das Gerät einen Jailbreak hat.

Beachten Sie, dass das Gerät selbst dann einen Jailbreak hatte, was bedeutet, dass beliebiger Code ausgeführt werden kann. Der Jailbreaker würde lediglich die Erkennungsmethode ändern, die Sie verwenden würden, um zu signalisieren, dass das Gerät nicht mit einem Jailbreak unterbrochen wurde.

referenz: https://forums.developer.Apple.com/thread/43073

credits gehen an Apple Staff, der dieselbe Frage beantwortet hat

0
igrek

Swift 3:  

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