Jak wykryć, że aplikacja na iOS działa na telefonie po jailbreaku?

Odpowiedzi:

90

To zależy, co masz na myśli mówiąc o jailbreak. W prostym przypadku powinieneś być w stanie sprawdzić, czy Cydia jest zainstalowana i przejść przez to - coś w stylu

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

W przypadku zhakowanych jąder jest to trochę (dużo) bardziej skomplikowane.

mądry kwark
źródło
17
Czy nie wystarczyłoby poszukać dowolnego pliku / katalogu poza piaskownicą? Podoba Ci się / etc?
Rhythmic Fistman
58
Zauważ, że nie wszyscy użytkownicy mają zainstalowaną Cydię - to nie jest dobry test i powinieneś raczej sprawdzić coś takiego jak / bin / bash, które / all / users / will / have.
Grant Paul
2
Gdzie apt przechowuje swoje informacje? Albo mógłbym po prostu wywołać polecenie system () i dowiedzieć się. Chcę się dowiedzieć, czy mają jakieś aplikacje i jeśli je mają, to ogranicz aplikację
Conradev
2
@RazorSharp W tym momencie prawie wszyscy użytkownicy mają Cydię. Prawdopodobnie wystarczy to teraz sprawdzić. Jeśli jednak chcesz, aby kontrola była w 100% niezawodna, powinieneś użyć kontroli opartej na jądrze, jak poniżej.
Grant Paul
1
FWIW sprawdzenie plików jest banalne do ominięcia. Można użyć mobilesubstrate, aby zaczepić fileExistsAtPath:i sprawić, że wróci NOna określoną ścieżkę, którą sprawdzasz.
toasted_flakes
55

To jest kod, który łączy kilka odpowiedzi, które znalazłem na tę potrzebę, i zapewni znacznie wyższy wskaźnik sukcesu:

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;
}
Yossi
źródło
1
@Porizm, to tylko połączenie niektórych odpowiedzi, które znalazłem. Niektóre z nich nie działały dla mnie, ale działały dla innych… więc z tym kodem nie ryzykujesz… Jeśli używasz tego, możesz być pewien na 99%. Jeśli chodzi o występ, możesz uruchomić go tylko raz na każdy bieg i zapisać gdzieś odpowiedź, nie musisz go uruchamiać za każdym razem ..
Yossi
3
@yossi i porizm apple zatwierdziły Twoją aplikację, która zawiera powyższy kod? proszę o odpowiedź
karthikPrabhu Alagu
4
Ta metoda powinna być wbudowaną funkcją C, a nie Objective-C. Zbyt łatwo jest odkryć i ominąć metody Objective-C, zwłaszcza jeśli je isJailbroken
nazwiesz
2
@Yossi Czy obejmuje to urządzenia po jailbreaku przy użyciu Taig?
Lakshay
3
@Lakshay Nie wiem .. Zapraszamy do sprawdzenia i dodania odpowiedzi :)
Yossi
54
+(BOOL)isJailbroken {
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
    return [[UIApplication sharedApplication] canOpenURL:url];
}

Sprawdzanie ścieżki pliku /Applications/Cydia.appnie jest dozwolone na zwykłym telefonie? Nigdy nie słyszałem, aby Apple to wykrył i odrzucił aplikację, ale Apple jest nieprzewidywalny. Cydia ma schemat adresu URL cydia: //, który można legalnie sprawdzić za pomocą aplikacji UIApplicationcanOpenURL:

Mark Johnson
źródło
1
To świetny sposób na sprawdzenie i nie wychodzi poza twoją piaskownicę. Jasne, jeśli jailbreaker nie ma zainstalowanej Cydii, zwróci NIE, ale myślę, że większość Jailbreaków instaluje Cydię.
Wim Haanstra
czy ten ciąg nie może zostać zmieniony, gdy aplikacja zostanie złamana?
NSRover
8
W przypadku iOS9.0 + musisz również dodać klucz LSApplicationQueriesSchemes w pliku app plist. W przeciwnym razie canOpenURL zawsze zwróci wartość false.
David V,
1
Zapewni to fałszywie dodatni wynik, jeśli użytkownik ma zainstalowaną aplikację zgodną ze schematem cydia: //, na przykład InstantTV.
thattyson
@thattyson thanks! Szukałem, dlaczego otrzymuję fałszywe alarmy
rickrvo
52

Sprawdzenie, czy jądro jest zepsute, nie jest TAKIE dużo bardziej skomplikowane.

Jailbreaking sprawia, że ​​jądro sprawdza podpis podpisanego kodu zawsze raportuje, że kod jest podpisany poprawnie, a nieprzerwane telefony nie mogą uruchamiać kodu ze złym podpisem.

Dlatego dołącz do aplikacji oddzielny plik wykonywalny ze złym podpisem. Może to być po prostu program składający się z trzech wierszy, który ma funkcję main () i wartość zwracaną. Skompiluj plik wykonywalny bez podpisywania kodu (wyłącz go w Ustawieniach projektu-> Kompiluj) i podpisz go innym kluczem, używając narzędzia wiersza poleceń „Codesign”.

Niech Twoja aplikacja wykonuje oddzielny plik wykonywalny. Jeśli twój program nie może uzyskać wartości zwracanej podczas uruchamiania oddzielnego pliku wykonywalnego z błędnym sig, z pewnością jest więziony. Jeśli oddzielny plik wykonywalny zwraca A-OK, telefon jest zdecydowanie jailbreak.

GregH
źródło
13
Czy w App Store można pobrać (pod-) plik wykonywalny, którego podpis jest nieprawidłowy?
fbrereto
34
Być może coś się zmieniło, ale czy wykonanie oddzielnego pliku wykonywalnego nie uniemożliwiłoby Ci zatwierdzenia do sklepu z aplikacjami?
Peter Zich,
4
Czy ktoś może odpowiedzieć na poprzednie komentarze? To ważne pytania.
Petr
Nikt naprawdę nie powstrzyma Cię przed zapisaniem Mach-O na dysku z nieprawidłowym podpisem. Jednak nie zgadzam się z odpowiedzią, że sprawdzenie, czy jądro jest zepsute, nie jest zaangażowane lub że jest to ostateczne sprawdzenie w jakikolwiek sposób.
saagarjha
20
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
}
Richard J. Ross III
źródło
To dobre rozwiązanie, ale xCon i inne podobne narzędzia mogą łatwo ominąć tę kontrolę. Więc szukam lepszego rozwiązania.
Alexei Robsky
7
@AlexeiRobsky nie ma idealnego rozwiązania. Zawsze znajdzie się ktoś, kto znajdzie sposób na ominięcie twojej ochrony, to po prostu fakt.
Richard J. Ross III
14

Możesz wykryć, czy urządzenie jest JailBroken, czy nie, sprawdzając następujące elementy:

  • Cydia jest zainstalowana
  • Sprawdź niektóre ścieżki systemowe
  • Wykonaj kontrolę integralności w piaskownicy
  • Przeprowadź weryfikację łącza symbolicznego
  • Sprawdź, czy tworzysz i zapisujesz pliki poza piaskownicą

Istnieje biblioteka open source, którą stworzyłem z różnych artykułów i książek. Wypróbuj na GitHub !

user3088680
źródło
14

W Swift 2.3 przerobiłem rozwiązanie dostarczone przez @Yossi

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
}
Alex Peda
źródło
6

Najbardziej zaawansowaną metodą, jaką znam, jest użycie objc_copyImageNames()funkcji. Zwraca listę aktualnie załadowanych bibliotek, a ponieważ większość ludzi ma MobileSubstrate na urządzeniach po jailbreaku i większość narzędzi do łamania iAP jest od niej zależna, pojawią się przynajmniej niektóre biblioteki MobileSubstrate.

Maxthon Chan
źródło
Czy masz jakieś linki do tego, jak wyglądają biblioteki MobileSubstrate / CydiaSubstrate? Nie mam telefonu po jailbreaku do zabawy, więc jeżdżę „na ślepo”, a wyszukiwania w Google w zasadzie przychodzą z twoim komentarzem powyżej.
chadbag
@chadbag Ja też nie mam, ale możesz poszukać debpliku MobileSubstrate, rozpakować go i umieścić na czarnej liście (prawie) wszystko .dylibto jest spakowane.
Maxthon Chan
Dzięki, rozgryzłem trochę kodu i mogę dodać więcej rzeczy na podstawie twojego komentarza. Wielkie dzięki!
chadbag
4

Nie znam żadnych „interfejsów API”, które istnieją w tym celu. Gdyby tak było, produkt maskujący jailbreak szybko je zakrył.

Jak wiele osób zwraca uwagę, jest to gra w kotka i myszkę. A kiedy obaj gracze stają się ekspertami, wszystko sprowadza się do tego, kto wykona pierwszy ruch. (Osoba trzymająca urządzenie.)

Znalazłem wiele dobrych sugestii dotyczących wykrywania jailbreaków w nowej książce Zdziarskiego „Hacking and Securing iOS Apps”. (Osobiście zapłaciłem więcej za eBook O'Reilly, ponieważ pozwalają na kopiowanie i wklejanie).

Nie, nie jestem powiązany z wydawcami. Ale uważam, że to dobra książka. Nie lubię po prostu publikować błędów hakerów, aby mogli je naprawić, więc pomyślałem, że wskażę książkę.

Walt Sellers
źródło
4

Spróbuj wykonać w aplikacji niepodpisany kod.

Urządzenia po jailbreaku mają zwykle następujące cechy:

  • uruchomić niepodpisany kod
  • ma zainstalowaną Cydię
  • ma pliki jailbreak
  • pełny dostęp r / w do całego systemu plików
  • niektóre pliki systemowe zostaną zmodyfikowane (zawartość, więc sha1 nie pasuje do oryginalnych plików)
  • utknęłam w określonej wersji (wersja z możliwością jailbreakingu)

Samo sprawdzenie istnienia pliku w celu wykrycia jailbreak jest skazane na niepowodzenie. Te kontrole są łatwe do ominięcia.

kurapix
źródło
3
Próba wykonania niepodpisanego kodu spowodowałaby odrzucenie aplikacji ze sklepu z aplikacjami
Frederic Yesid Peña Sánchez
4

Niektóre typowe pliki do sprawdzenia: /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

Większość sprawdza pliki związane z Cydią.

DevC
źródło
3

Proponuję poszukać plików, których nie ma na „waniliowym” iPhonie. Wszystkie zestawy jailbreak, które widziałem, instalują ssh. To może być dobry wskaźnik telefonu po jailbreaku.

Gordon Wilson
źródło
18
ssh nigdy nie jest instalowany automatycznie, użytkownicy muszą zainstalować go samodzielnie.
Grant Paul
1
Nie nadążałem za sceną jailbreak. Ale jak sobie przypominam, kiedy to pisałem (styczeń '09), Ziphone i inni instalowali domyślnie ssh i podsystem bsd. Może to już nieprawda.
Gordon Wilson
12
zaufaj mi, kiedy powiem, że chpwn dotrzymał kroku scenie jailbreak.
Winfield Trail
3

To, co zrobiliśmy, to to, że mamy już kanał RSS do komunikacji z naszymi użytkownikami ( Stocks Live ), umieściliśmy wiadomość, która brzmi mniej więcej tak:

Niektóre urządzenia po jailbreaku mają problemy bla bla bla, zrobiliśmy hack, aby rozwiązać te problemy, ale musimy wiedzieć, czy jest to urządzenie po jailbreaku, czy nie, naciśnij tutaj, aby aplikacja rozwiązała problem. Jeśli kiedykolwiek wrócisz do normalności, tj. Usunąłeś jailbreak, naciśnij tutaj.

Następnie przetwarzasz interakcję użytkownika i robisz to, co jest właściwe, np. Zachowujesz się inaczej itp.

Ilam
źródło
3

Spróbuj znaleźć plik, który tworzy Cydia lub urządzenie po jailbreaku. Lub spróbuj pisać w pliku poza czarną skrzynką aplikacji. Jeśli ci się to uda, urządzenie jest przejęte / po jailbreaku :)

- (BOOL)jailbroken
{
    NSFileManager * fileManager = [NSFileManager defaultManager];
    return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
karim
źródło
2
Firma Apple zatwierdziła Twoją aplikację, która zawiera powyższy kod?
karthikPrabhu Alagu
3

Użyj następującego kodu dla Swift 4 i nowszych wersji: Dodaj następujący kod w appdelegate:

private func getJailbrokenStatus() -> Bool {
    if TARGET_IPHONE_SIMULATOR != 1 {
        // Check 1 : existence of files that are common for jailbroken devices
        if FileManager.default.fileExists(atPath: "/Applications/Cydia.app")
            || FileManager.default.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib")
            || FileManager.default.fileExists(atPath: "/bin/bash")
            || FileManager.default.fileExists(atPath: "/usr/sbin/sshd")
            || FileManager.default.fileExists(atPath: "/etc/apt")
            || FileManager.default.fileExists(atPath: "/private/var/lib/apt/")
            || UIApplication.shared.canOpenURL(URL(string:"cydia://package/com.example.package")!) {
            return true
        }
        // Check 2 : Reading and writing in system directories (sandbox violation)
        let stringToWrite = "Jailbreak Test"
        do {
            try stringToWrite.write(toFile:"/private/JailbreakTest.txt", atomically:true, encoding:String.Encoding.utf8)
            //Device is jailbroken
            return true
        } catch {
            return false
        }
    }
    else {
        return false
    }
}

func applicationDidBecomeActive (_ application: UIApplication) {

    if getJailbrokenStatus() {
        let alert = UIAlertController(title: LocalizedKeys.Errors.jailbreakError, message: LocalizedKeys.Errors.jailbreakErrorMessage, preferredStyle: UIAlertController.Style.alert)
        let jailBrokenView = UIViewController()

        jailBrokenView.view.frame = UIScreen.main.bounds
        jailBrokenView.view.backgroundColor = .white
        self.window?.rootViewController = jailBrokenView
        jailBrokenView.present(alert, animated: true, completion: nil)
    }

    if #available(iOS 11.0, *) {
        if !UIScreen.main.isCaptured {
            DispatchQueue.main.async {
                self.blockImageView.removeFromSuperview()
            }
        }
    }
}
Paritosh Pawar
źródło
1

Oto moje rozwiązania: Krok 1

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

Krok 2: Wywołaj to w viewDidLoad()kontrolerze widoku ekranu startowego (lub jakimkolwiek VC, do którego dzwonisz po raz pierwszy):

       // show a blank screen or some other view controller
       let viewController = UIDevice.current.isJailBroken() ? JailBrokenViewController() : NextViewController()
       self.navigationController?.present(viewController, animated: true, completion:nil)
Sanjeevcn
źródło
-2

Spróbuj uzyskać dostęp do /Application/Preferences.app/General.plist Powinieneś być w stanie to zrobić na iPhonie z jailbreakiem Na telefonie innym niż Jb nie będziesz mógł uzyskać do niego dostępu

aker
źródło
3
Ta odpowiedź byłaby bardziej interesująca w przypadku kodu źródłowego. IMHO: To dałoby ci pozytywną opinię.
Johan Karlsson,
5
-1 = Unjailbroken urządzenia mogą również otwierać i czytać ten plik. (Testowane)
szczery
@JohanKarlsson Zakładam, że czytelnicy mogą tutaj napisać własny kod źródłowy. Jeśli nie mogą - co oni tutaj robią?
gnasher729