Określanie, czy iPhone jest uszkodzony w więzieniu programowo

79

Jak określić (programowo), czy iPhone / iPod jest:

  1. Więzienie złamane
  2. Uruchamianie pękniętej kopii oprogramowania

Pinch Media może wykryć, czy telefon jest zepsuty w więzieniu lub uruchomione oprogramowanie jest złamane, czy ktoś wie, jak to robi? Czy są jakieś biblioteki?

Richard Stelling
źródło
1
Apple wie, jak to ustalić: p
JoshJordan,
2
Jeśli interesuje Cię to pytanie, dlaczego nie wesprzeć propozycji Strefy 51 dotyczącej łamania więzień witryny wymiany stosów
Richard Stelling

Odpowiedzi:

39

Oto jeden ze sposobów wykrycia, czy Twoja aplikacja została złamana.

Krótko mówiąc: pękanie zwykle wymaga zmiany Info.plist. Ponieważ jest to zwykły plik, do którego masz dostęp, dość łatwo jest określić takie zmiany.

zakovyrya
źródło
1
Niestety istnieje obejście, które łamie ten mechanizm wykrywania. Po zainstalowaniu aplikacji klucz SignerIdentity nie jest już potrzebny, więc cracker może po prostu ssh do swojego telefonu po jailbreaku i edytować plik plist, aby go usunąć.
Lily Ballard,
@KevinBallard Czy masz jakieś zalecenia dotyczące wykrywania typowych jailbreaków w 2017 roku?
Cœur
@ Cœur Nie, nie zajmowałem się tym od czasu napisania tego komentarza.
Lily Ballard
25

Wykrywanie telefonu po jailbreaku jest tak proste, jak sprawdzenie obecności /private/var/lib/apt/folderu. Chociaż nie wykrywa to użytkowników korzystających tylko z instalatora, do tej pory większość z nich zainstalowała Cydię, Icy lub RockYourPhone (wszyscy używają apt)

Aby wykryć pirackich użytkowników, najłatwiej jest sprawdzić obecność SignerIdentityklucza w aplikacji Info.plist. Ponieważ zaawansowani crackerzy mogą łatwo znaleźć standardowe [[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"]testy, najlepiej jest ukryć te wywołania za pomocą środowiska wykonawczego Objective C dostępnego za pośrednictwem #import <objc/runtime.h>alternatywnych odpowiedników.

rpetrich
źródło
10

Aby rozwinąć odpowiedź zakovyrya, możesz użyć następującego kodu:

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

JEDNAK osoba dokonująca jailbreaku Twojej aplikacji może dokonać edycji szesnastkowej Twojego programu i jako taka może edytować ciąg @ "SignerIdentity", aby odczytać @ "siNGeridentity" lub coś innego, co zwróciłoby nil i przeszedł.

Jeśli więc skorzystasz z tego (lub dowolnej innej sugestii z http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html ):

  • Nie oczekuj, że będzie działać wiecznie
  • Nie używaj tych informacji, aby w jakikolwiek sposób łamać / utrudniać aplikację (w przeciwnym razie będą miały powód do jej szesnastowania, więc Twoja aplikacja nie będzie wiedziała, że ​​jest jailbreak)
  • Prawdopodobnie mądrze byłoby zaciemnić ten fragment kodu. Na przykład możesz umieścić w kodzie odwrócony ciąg zakodowany w base64, a następnie zdekodować go w aplikacji, odwracając proces.
  • Potwierdź swoją walidację później w swoim kodzie (np. Kiedy powiedziałem SignerIdentity, czy faktycznie było napisane SignerIdentity lub siNGeridentity?)
  • Nie mów ludziom w publicznych witrynach internetowych, takich jak stackoverflow, jak to robisz
  • Pamiętaj, że jest to tylko przewodnik i nie jest niezawodny (ani odporny na pękanie!) - z wielką mocą wiąże się wielka odpowiedzialność.
Benjie
źródło
To sprawdza SignerIdentity w pakiecie aplikacji, ale co z przypadkiem, gdy aplikacja nie została zhakowana lub coś innego, ale urządzenie jest JailBroken, jak byś to wykrył?
Edward Ashak
Zadaj to jako pytanie na SO, a ktoś odpowie :)
Benjie
5

Aby rozwinąć powyższe komentarze Yonela i Benjiego:

1) Metoda Landona Fullera polegająca na sprawdzaniu szyfrowania, powiązana powyżej przez yonela, wydaje się być jedyną, która wciąż nie została pokonana przez automatyczne narzędzia do łamania zabezpieczeń. Nie martwiłbym się zbytnio, że Apple w najbliższym czasie zmieni stan nagłówka LC_ENCRYPTION_INFO. Wydaje się, że ma nieprzewidywalne skutki na iPhone'ach z jailbreakiem (nawet jeśli użytkownik kupił kopię ...)

W każdym razie nie podjąłbym żadnych pochopnych działań przeciwko użytkownikowi na podstawie tego kodu ...

2) Uzupełnienie komentarza Benjiego dot. zaciemnianie (absolutna konieczność, gdy mamy do czynienia z wartościami ciągów znaków w kodzie antypirackim): podobnym, ale być może nawet łatwiejszym sposobem jest zawsze sprawdzanie zasolonej, zaszyfrowanej wersji wartości, której szukasz. Na przykład (nawet jeśli to sprawdzenie nie jest już wydajne), sprawdziłbyś nazwę każdego klucza MainBundle jako md5 (keyName + "some secret salt") pod kątem odpowiedniej stałej ... Raczej proste, ale z pewnością pokonasz każdą próbę zlokalizowania strunowy.

Oczywiście wymaga to możliwości pośredniego zapytania o wartość, którą chcesz porównać (na przykład przechodząc przez tablicę, która ją zawiera). Ale tak jest najczęściej.


źródło
Czy metoda Landona Fullera nadal działa w dzisiejszych czasach z iOS 7?
Basil Bourque