80 Stimmen

Programmatisch feststellen, ob ein iPhone Jailbreak ist

Wie kann man (programmatisch) feststellen, ob ein iPhone/iPod:

  1. Gefängnis gebrochen
  2. Ausführen einer geknackten Kopie Ihrer Software

Pinch Medien kann erkennen, ob ein Telefon im Gefängnis ist oder die Software geknackt wurde. Weiß jemand, wie das geht? Gibt es irgendwelche Bibliotheken?

39voto

zakovyrya Punkte 9341

Hier ist eine der Möglichkeiten, um festzustellen, ob Ihre App geknackt wurde.

Kurz gesagt: Das Knacken erfordert in der Regel eine Änderung der Info.plist. Da es sich um eine reguläre Datei handelt, auf die Sie Zugriff haben, ist es ziemlich einfach, solche Änderungen festzustellen.

25voto

rpetrich Punkte 32030

Die Erkennung eines jailbroken Telefons ist so einfach wie die Überprüfung auf das Vorhandensein von /private/var/lib/apt/ Ordner. Obwohl dies keine reinen Installer-Benutzer erkennt, haben die meisten inzwischen Cydia, Icy oder RockYourPhone installiert (die alle apt verwenden)

Um Raubkopierer zu erkennen, ist es am einfachsten, auf das Vorhandensein einer SignerIdentity Schlüssel in Ihrer App Info.plist . Da fortgeschrittene Cracker den Standard leicht finden können [[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] Prüfungen ist es am besten, diese Aufrufe mit der Objective C-Laufzeitumgebung zu verbergen, die über #import <objc/runtime.h> oder verwenden Sie alternative Äquivalente.

10voto

Benjie Punkte 7393

Um die Antwort von zakovyrya zu ergänzen, könnten Sie den folgenden Code verwenden:

if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) {
  // Jailbroken
}

JEDOCH kann die Person, die Ihre Anwendung jailbreakt, Ihr Programm hexeditieren und somit die Zeichenkette @"SignerIdentity" in @"siNGeridentity" oder etwas anderes umwandeln, was den Wert Null zurückgeben würde und somit erfolgreich wäre.

Wenn Sie also diesen (oder einen der anderen Vorschläge aus http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html ):

  • Erwarten Sie nicht, dass es ewig funktioniert
  • Verwenden Sie diese Informationen nicht, um Ihre Anwendung in irgendeiner Weise zu brechen/behindern (andernfalls werden sie einen Grund haben, sie zu hexeditieren, so dass Ihre Anwendung nicht weiß, dass sie jailbroken ist)
  • Wahrscheinlich ist es klug, diesen Teil des Codes zu verschleiern. Sie könnten z. B. die base64-kodierte umgekehrte Zeichenfolge in Ihren Code einfügen und sie dann in der Anwendung durch Umkehrung des Prozesses dekodieren.
  • Überprüfen Sie Ihre Validierung später in Ihrem Code (z. B. wenn ich SignerIdentity sage, heißt es dann tatsächlich SignerIdentity oder siNGeridentity?)
  • Verraten Sie nicht auf einer öffentlichen Website wie Stackoverflow, wie Sie es machen
  • Denken Sie daran, dass es sich nur um einen Leitfaden handelt, der nicht narrensicher ist (auch nicht knacksicher!) - mit großer Macht kommt große Verantwortung.

5voto

Um auf die obigen Kommentare von yonel und Benjie einzugehen:

1) Die Methode von Landon Fuller die sich auf die Verschlüsselungsprüfung verlassen, die oben von yonel verlinkt wurde, scheinen die einzigen zu sein, die noch nicht von automatisierten Cracking-Tools besiegt wurden. Ich würde mir keine allzu großen Sorgen darüber machen, dass Apple den Status des LC_ENCRYPTION_INFO-Headers in nächster Zeit ändert. Er scheint einige unvorhersehbare Auswirkungen auf jailbroken iPhones zu haben (selbst wenn der Benutzer eine Kopie gekauft hat...)

Ich würde auf jeden Fall keine voreiligen Maßnahmen gegen einen Benutzer aufgrund dieses Codes ergreifen...

2) Um Benjies Kommentar zur Verschleierung zu ergänzen (eine absolute Notwendigkeit, wenn Sie mit String-Werten in Ihrem Anti-Piraterie-Code arbeiten): eine ähnliche, aber vielleicht noch einfachere Möglichkeit ist, immer eine gesalzen hashed Version des Wertes, den Sie suchen. Zum Beispiel (auch wenn diese Prüfung nicht mehr effizient ist), würden Sie jeden MainBundle-Schlüsselnamen als md5(keyName + "some secret salt") gegen die entsprechende Konstante prüfen... Ziemlich einfach, aber sicher, um jeden Versuch zu vereiteln, die Zeichenkette zu finden.

Dies setzt natürlich voraus, dass Sie in der Lage sind, den Wert, den Sie vergleichen wollen, indirekt abzufragen (z. B. indem Sie durch ein Array gehen, das ihn enthält). Aber das ist meistens der Fall.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X