Frage

Wenn ich möchte, dass meine app sich anders Verhalten, auf einem jailbroken iPhone, wie würde ich mich über diese Entscheidung?

War es hilfreich?

Lösung

Es hängt davon ab, was Sie mit Jailbreak bedeuten. Im einfachen Fall sollten Sie in der Lage sein zu sehen, ob Cydia installiert ist und gehen von diesen - so etwas wie

NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
   // do something useful
}

Für gehackt Kernel, es ist ein wenig (viel) mehr beteiligt.

Andere Tipps

+(BOOL)isJailbroken {
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
    return [[UIApplication sharedApplication] canOpenURL:url];
}

Überprüfen der Dateipfad /Applications/Cydia.app auf einem normalen Telefon nicht erlaubt? Ich habe noch nie von Apple Erkennung dieses und die Ablehnung einer App für sie gehört, aber Apple ist nicht vorhersehbar. Cydia hat eine URL-Schema Cydia: // die legal mit UIApplication canOpenURL: geprüft werden kann

Dies ist ein Code, der einige Antworten kombiniert ich für diesen Bedarf gefunden, und gibt Ihnen viele höhere Erfolgsquote:

BOOL isJailbroken()
{
#if !(TARGET_IPHONE_SIMULATOR)

   if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/MobileSubstrate.dylib"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/bin/bash"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/usr/sbin/sshd"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/etc/apt"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/private/var/lib/apt/"] ||
       [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]])  {
         return YES;
   }

   FILE *f = NULL ;
   if ((f = fopen("/bin/bash", "r")) ||
      (f = fopen("/Applications/Cydia.app", "r")) ||
      (f = fopen("/Library/MobileSubstrate/MobileSubstrate.dylib", "r")) ||
      (f = fopen("/usr/sbin/sshd", "r")) ||
      (f = fopen("/etc/apt", "r")))  {
         fclose(f);
         return YES;
   }
   fclose(f);

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

#endif

   return NO;
}

Überprüfen, ob der Kernel gebrochen ist, ist nicht viel mehr beteiligt.

Jailbreaking macht die Signaturprüfung des Kernels von signiertem Code immer diesen Code berichtet korrekt signiert, ungebrochene Telefone nicht Code mit einer schlechten Unterschrift ausgeführt werden können.

So gehört eine separate ausführbare Datei in der App mit einer schlechten Unterschrift. Es könnte nur ein 3-Zeilen-Programm sein, das main () und einen Rückgabewert hat. Kompilieren Sie die ausführbare Datei ohne Code Signieren (schalten Sie es im Projekt Einstellungen-> Build-off) und unterschreiben Sie es mit einem anderen Schlüssel mit dem „Co-Design“ Commandline-Dienstprogramm.

Haben Sie Ihre App die separate ausführbare exec. Wenn Ihr Programm nicht den Rückgabewert erhalten, wenn die separate ausführbare Datei mit dem schlechten sig ausgeführt wird, ist es auf jedem Fall ins Gefängnis. Wenn die separate ausführbare A-OK zurückgibt, wird das Telefon definitiv jailbroken.

BOOL isJailbroken()
{
#if TARGET_IPHONE_SIMULATOR
    return NO;
#else
    FILE *f = fopen("/bin/bash", "r");

    if (errno == ENOENT)
    {
        // device is NOT jailbroken
        fclose(f);
        return NO;
    }
    else {
        // device IS jailbroken
        fclose(f);
        return YES;
    }
#endif
}

Sie können erkennen, ob ein Gerät jailbroken oder nicht durch Überprüfung für das folgende ist:

  • Cydia installiert
  • einige der Systempfade überprüfen:
  • Führen Sie eine Sandbox-Integritätsprüfung
  • Führen Symlink Überprüfung
  • Stellen Sie sicher,
  • , ob Sie erstellen und Schreiben von Dateien außerhalb der Sandbox

Es ist eine Open-Source-Bibliothek, die ich aus verschiedenen Artikeln und Büchern geschaffen. Ausprobieren auf GitHub !

I überarbeitet in Swift 2.3 die Lösung von @Yossi versehen

public static func jailbroken(application: UIApplication) -> Bool {
    guard let cydiaUrlScheme = NSURL(string: "cydia://package/com.example.package") else { return isJailbroken() }
    return application.canOpenURL(cydiaUrlScheme) || isJailbroken()
}


static func isJailbroken() -> Bool {

    if isSimulator {
        return false
    }

    let fileManager = NSFileManager.defaultManager()
    if fileManager.fileExistsAtPath("/Applications/Cydia.app") ||
        fileManager.fileExistsAtPath("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
        fileManager.fileExistsAtPath("/bin/bash") ||
        fileManager.fileExistsAtPath("/usr/sbin/sshd") ||
        fileManager.fileExistsAtPath("/etc/apt") ||
        fileManager.fileExistsAtPath("/usr/bin/ssh") {
        return true
    }

    if canOpen("/Applications/Cydia.app") ||
        canOpen("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
        canOpen("/bin/bash") ||
        canOpen("/usr/sbin/sshd") ||
        canOpen("/etc/apt") ||
        canOpen("/usr/bin/ssh") {
        return true
    }

    let path = "/private/" + NSUUID().UUIDString
    do {
        try "anyString".writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
        try fileManager.removeItemAtPath(path)
        return true
    } catch {
        return false
    }
}

static func canOpen(path: String) -> Bool {
    let file = fopen(path, "r")
    guard file != nil else { return false }
    fclose(file)
    return true
}

Die anspruchsvollste Methode, die ich kenne objc_copyImageNames() Funktion verwendet. Es gibt eine Liste der aktuell geladenen Bibliotheken und da die meisten Menschen Mobilesubstrate auf jailbroken Geräte und die meisten iAP Riss Werkzeuge hängen davon ab, zumindest einige Mobile Bibliotheken wird sich zeigen.

Ich bin keine Kenntnis von „APIs“, die für diese existieren. Gäbe es dann ein Jailbreak-Maskierung Produkt würde sich schnell verschleiern.

Wie viele Menschen weisen darauf hin, ist es ein Katz-und-Maus-Spiel. Und nachdem beide Spieler Experte, es kommt alles darauf an, wer den ersten Schritt erhält. (Person, die das Gerät.)

fand ich viele gute Vorschläge zur Erkennung Jailbreak in Zdziarski neues Buch „Hacking und Absichern von iOS Apps“. (Ich persönlich mehr für den O'Reilly eBook bezahlt, weil sie copy-and-paste erlauben.)

Nein, ich bin nicht mit den Verlagen zusammen. Aber ich habe es ein gutes Buch. Ich mag es nicht nur Fehler Hacker veröffentlichen, damit sie sie beheben können, so dass ich dachte, dass ich auf das Buch hinweisen würde.

Versuchen Sie nicht signierten Code durch Ihre Anwendung ausgeführt wird.

Ein jailbroken Gerät in der Regel hat die folgenden Eigenschaften:

  • run unsignierten Code
  • hat Cydia installiert
  • hat Jailbreak-Dateien
  • full r / w Zugriff auf das gesamte Dateisystem
  • einige Systemdateien geändert wurden, werden (Inhalt und so wird SHA1 nicht mit Originaldateien entsprechen)
  • stecken bestimmte Version (jailbreakable Version)

Just checking Datei Existenz für Jailbreak-Erkennung ist zum Scheitern verurteilt. Diese Kontrollen sind leicht zu umgehen.

Einige gemeinsamen Dateien zu überprüfen: /Library/MobileSubstrate/MobileSubstrate.dylib

/Applications/Cydia.app

/var/cache/apt

/var/lib/apt

/var/lib/cydia

/var/log/syslog

/var/tmp/cydia.log

/bin/bash

/bin/sh

/usr/sbin/sshd

/usr/libexec/ssh-keysign

/etc/ssh/sshd_config

/etc/apt

Die meisten Check für Cydia zugehörigen Dateien.

Ich würde vorschlagen, die Suche nach Dateien, die nicht auf einem „Vanille“ iPhone sind. Alle Jailbreak-Kits ich gesehen habe ssh installieren. Das könnte ein guter Indikator für ein jailbroken Telefon sein.

Was wir getan haben ist, wir haben bereits einen RSS-feed für die Kommunikation mit unseren Nutzern (Aktien Live), legen wir eine Nachricht, die besagt so etwas wie dieses:

Einige jailbroken-Geräte haben Probleme bla bla bla, machten wir einen hack, um zu lösen diese Probleme, aber wir müssen wissen, ob dies ein jailbroken-Gerät oder nicht, hier drücken, damit die app das Problem behebt.Wenn Sie jemals wieder zur Normalität zurückkehren, dh entfernt den jailbreak, drücken Sie hier.

Dann verarbeiten Sie die Interaktion mit dem Benutzer und tun, was geeignet ist, wie verhält sich anders, etc...

Versuchen Sie erstellen eine Datei, die Cydia oder jailbroken Gerät zu finden. Oder versuchen, in einer Datei außerhalb der App-Blackbox zu schreiben. Wenn es Ihnen gelingt, das zu tun, wird das Gerät kompromittiert / jailbroken:)

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

Sie werden ein sich bewegendes Ziel zu folgen, aber Sie könnten nach dem Fortschritt dieser Ressourcen versuchen, um zu sehen, wie effektiv Ihre Technik ist:

Heres meine Lösungen:

extension UIDevice {
    func isJailBroken() -> Bool {
        var jailBroken = false
        let cydiaPath = "/Applications/Cydia.app"
        let aptPath = "/private/var/lib/apt/"
        if FileManager.default.fileExists(atPath: cydiaPath) {
            jailBroken = true
        }
        if FileManager.default.fileExists(atPath: aptPath) {
            jailBroken = true
        }
        return jailBroken
    }
}

und rufen Sie es in viewDidLoad() in Ihren Start-Bildschirm View-Controller (oder was auch immer VC Sie zum ersten Mal anrufen):

    if UIDevice.current.isJailBroken() {
       // show a blank screen or some other view controller
       let jailbreakVC = JailBrokenViewController()
       self.navigationController?.present(jailbreakVC, animated: true, completion:nil)
    } else {
     // continue executing your next View controller
     let nextVC = NextViewController()
     self.navigationController?.present(nextVC, animated: true, completion:nil)
    }

Versuchen Sie auch /Application/Preferences.app/General.plist Sie sollten Sie dazu auf einem jailbroken iPhone in der Lage sein, Die Lage sein, sie auf nicht-Jb Telefon werden Sie nicht zugreifen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top