Bir iOS uygulamasının jailbreak yapılmış bir telefonda çalıştığını nasıl belirleyebilirim?


Yanıtlar:


90

Jailbreak ile ne demek istediğine bağlı. Basit durumda, Cydia'nın kurulu olup olmadığını görebilmeli ve bununla devam etmelisiniz - böyle bir şey

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

Saldırıya uğramış çekirdeklerde, biraz (çok) daha karmaşıktır.


17
Korumalı alanınızın dışında herhangi bir dosya / dizin aramak yeterli olmaz mı? / Etc gibi mi?
Ritmik Fistman

58
Tüm kullanıcıların Cydia'nın yüklü olmadığını unutmayın - bu iyi bir kontrol değildir ve / all / users / sahip olacağı / bin / bash gibi bir şey olup olmadığını kontrol etmelisiniz.
Grant Paul

2
Apt bilgilerini nerede saklıyor? Yoksa sadece bir system () komutunu çağırabilir ve öğrenebilir miyim. Belirli uygulamalara sahip olup olmadıklarını öğrenmek ve bu uygulamalara sahiplerse uygulamayı kısıtlamak istiyorum
conradev

2
@RazorSharp Bu noktada, neredeyse tüm kullanıcıların Cydia var. Muhtemelen şimdi bunu kontrol etmek yeterli. Ancak,% 100 güvenilir bir kontrol istiyorsanız, aşağıdaki gibi çekirdek tabanlı bir kontrol kullanmak isteyeceksiniz.
Grant Paul

1
FWIW dosya kontrollerini atlamak önemsizdir. Mobilesubstrate, kancalamak fileExistsAtPath:ve NOkontrol ettiğiniz belirli yol için geri dönmesini sağlamak için kullanılabilir.
toasted_flakes

56

Bu ihtiyaç için bulduğum bazı cevapları birleştiren bir kod ve size çok daha yüksek başarı oranı verecek:

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

1
@Porizm, bu sadece bulduğum bazı cevapların bir kombinasyonu. Bazıları benim için işe yaramadı, ama diğerleri için çalıştı .. bu yüzden bu kodla şansınız yok .. Bunu kullanırsanız% 99 emin olabilirsiniz. Performans ile ilgili olarak, her çalıştırmada sadece bir kez çalıştırabilir ve cevabı bir yere kaydedebilirsiniz, Her seferinde çalıştırmanız gerekmez ..
Yossi

3
@yossi ve porizm apple yukarıdaki kodu içeren uygulamanızı onayladı mı? lütfen cevap verin
karthikPrabhu Alagu

4
Bu yöntem, Objective-C değil , eğik bir C işlevi olmalıdır . Objective-C yöntemlerini bulmak ve atlamak çok kolaydır, özellikle de isJailbroken
denirseniz

2
@Yossi bu cihazları Taig kullanarak hapse attı mı?
Lakshay

3
@Lakshay Bilmiyorum .. Kontrol etmek ve buraya bir cevap eklemek için davet daha
Yossi

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

Dosya yolunu kontrol etme /Applications/Cydia.appNormal bir telefonda izin verilmiyor mu? Apple'ın bunu algıladığını ve bunun için bir uygulamayı reddettiğini hiç duymadım, ancak Apple öngörülemez. Cydia bir URL şemasına sahiptir cydia: // UIApplication ile yasal olarak kontrol edilebilircanOpenURL:


1
Bu kontrol etmek için harika bir yoldur ve korumalı alanınızın dışına çıkmaz. Tabii, jailbreaker Cydia yüklü değilse, HAYIR dönecektir, ancak çoğu Jailbreaks'ın Cydia'yı yüklediğini düşünüyorum.
Wim Haanstra

uygulama kırıldığında bu dize değiştirilemez mi?
NSRover

8
İOS9.0 + için uygulama plistine LSApplicationQueriesSchemes anahtarını da eklemeniz gerekir. Aksi takdirde canOpenURL her zaman yanlış döndürür.
David V

1
Bu, kullanıcının InstantTV gibi cydia: // şemasına uyan bir uygulaması yüklüyse yanlış pozitif sağlar.
thattyson

@thattyson teşekkürler! Neden yanlış pozitifler aldığımı kontrol etmeye bakıyordum
rickrvo

52

Çekirdeğin kırılıp kırılmadığını kontrol etmek çok daha fazla dahil değildir.

Jailbreak, çekirdeğin imzalı kodun imza kontrolünü her zaman kodun doğru imzalandığını bildirir, kırılmamış telefonlar kötü imza ile kod çalıştıramaz.

Bu nedenle, uygulamaya kötü imza içeren ayrı bir yürütülebilir dosya ekleyin. Sadece main () ve bir dönüş değeri olan 3 satırlı bir program olabilir. Yürütülebilir kodu kod imzalamadan derleyin (Project Settings-> Build'da kapatın) ve "codesign" komut satırı yardımcı programını kullanarak farklı bir anahtarla imzalayın.

Uygulamanızın ayrı yürütülebilir dosyayı çalıştırmasını sağlayın. Programınız bozuk sig ile ayrı yürütülebilir dosyayı çalıştırırken dönüş değerini alamazsa, kesinlikle hapse atılır. Ayrı yürütülebilir dosya A-OK döndürürse, telefon kesinlikle jailbreak yapar.


13
App Store'dan imzası geçersiz olan (alt) bir yürütülebilir dosya alabilir misiniz?
fbrereto

34
Belki de işler değişti, ancak ayrı bir yürütülebilir dosya yürütmek, uygulama mağazasına onaylanmanızı engellemez?
Peter Zich

4
Birisi daha önce yorumlarda cevap verebilir mi? Bu önemli sorular.
Petr

Hiç kimse, geçersiz bir imzayla diske Mach-O yazmanızı gerçekten engellemeyecek. Ancak, çekirdeğin kırıldığını kontrol etmenin ilgili olmadığı veya bunun hiçbir şekilde kesin bir kontrol olmadığı cevabına katılmıyorum.
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
}

Bu iyi bir çözüm, ancak xCon ve bunun gibi diğer araçlar bu kontrolü kolayca atlayabilir. Bu yüzden daha iyi bir çözüm arıyorum.
Alexei Robsky

7
@AlexeiRobsky mükemmel bir çözüm yok. Her zaman korumanızı atlamanın bir yolunu bulacak biri olacak, bu sadece bir gerçek.
Richard J. Ross III

14

Aşağıdakileri kontrol ederek bir cihazın JailBroken olup olmadığını tespit edebilirsiniz:

  • Cydia kuruldu
  • Bazı sistem yollarını doğrulayın
  • Korumalı alan bütünlüğü denetimi yapma
  • Symlink doğrulaması yapın
  • Korumalı Alanınızın dışında dosya oluşturup yazmadığınızı doğrulayın

Çeşitli makale ve kitaplardan oluşturduğum açık kaynaklı bir kütüphane var. GitHub'da deneyin !


14

Swift 2.3'te @Yossi tarafından sağlanan çözümü elden geçirdim

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
}

6

Bildiğim en sofistike yöntem objc_copyImageNames()fonksiyonu kullanmak . Şu anda yüklü kitaplıkların bir listesini döndürür ve çoğu insan jailbreak cihazlarında MobileSubstrate bulunduğundan ve çoğu iAP çatlak aracı buna bağlıdır, en azından bazı MobileSubstrate kitaplıkları görünecektir.


MobileSubstrate / CydiaSubstrate kütüphanelerinin nasıl göründüğüne dair bir bağlantınız var mı? Ben "kör" sürüş ile oynamak için jailbreak yapılmış bir telefon yok ve Google aramalar temelde yukarıdaki yorum ile gel.
chadbag

@chadbag Bende bir tane yok ama debMobileSubstrate dosyasını arayabilir, paketinden çıkarabilir ve kara listeye alabilirsiniz (neredeyse) hepsi .dylibpaketlenmiştir.
Maxthon Chan

Teşekkürler, anladım bazı kod var ve yorumunuza göre biraz daha şeyler ekleyebilirsiniz. Çok teşekkürler!
chadbag

4

Bunun için var olan herhangi bir "API" nin farkında değilim. Eğer olsaydı, bir jailbreak-maskeleme ürünü onları çabucak örtecekti.

Birçok insanın işaret ettiği gibi, bir kedi ve fare oyunu. Ve her iki oyuncu da uzman olduktan sonra, ilk hamleyi kimin yaptığını görüyoruz. (Cihazı tutan kişi.)

Zdziarski'nin yeni "iOS Uygulamalarını Hacking and Secure" adlı kitabında jailbreak'i tespit etmek için birçok iyi öneri buldum. (Şahsen, O'Reilly e-Kitap için daha fazla ödeme yaptım çünkü kopyala ve yapıştır işlemine izin veriyorlar.)

Hayır, yayıncılara bağlı değilim. Ama iyi bir kitap buldum. Bilgisayar korsanlarının hatalarını düzeltmek için yayınlamak istemiyorum, bu yüzden kitaba işaret edeceğimi düşündüm.


4

Uygulamanız aracılığıyla imzasız kod çalıştırmayı deneyin.

Jailbreak yapılmış cihazlar genellikle aşağıdaki özelliklere sahiptir:

  • imzasız kod çalıştır
  • Cydia kuruldu
  • jailbreak dosyaları var
  • tüm dosya sistemine tam r / w erişimi
  • bazı sistem dosyaları değiştirilmiş olacak (içerik ve böylece sha1 orijinal dosyalarla eşleşmiyor)
  • belirli bir sürüme yapışmış (jailbreak yapılabilir sürüm)

Jailbreak algılaması için sadece dosya varlığını kontrol etmek başarısız olmaya mahkumdur. Bu kontrolleri atlamak kolaydır.


3
İmzasız kod yürütmeye çalışmak uygulamanızın uygulama
mağazasından

4

Kontrol edilecek bazı yaygın dosyalar: /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

Çoğu Cydia ilgili dosyaları kontrol edin.


3

Bir "vanilya" iPhone'da bulunmayan dosyaları aramanızı öneririm. Gördüğüm tüm jailbreak kitleri ssh'i kuruyor. Bu bir jailbreak telefonunun iyi bir göstergesi olabilir.


18
ssh hiçbir zaman otomatik olarak kurulmaz, kullanıcılar kendileri kurmalıdır.
Grant Paul

1
Jailbreak sahnesini pek takip etmedim. Ancak hatırladığım gibi, bunu yazdığımda (Jan '09), Ziphone ve diğerleri varsayılan olarak ssh ve bsd alt sistemini kurdular. Belki de bu artık doğru değil.
Gordon Wilson

12
chpwn'ın jailbreak sahnesine ayak uyduğunu söylediğimde bana güven.
Winfield Trail

3

Yaptığımız şey, kullanıcılarımızla ( Stocks Live ) iletişim kurmak için zaten bir RSS feedimiz var , böyle bir şeyi bildiren bir haber öğesi koyduk:

Bazı jailbreak cihazlarında sorunlar var bla bla bla, bu sorunları çözmek için bir hack yaptık ama bu jailbreak yapılmış bir cihaz olup olmadığını bilmemiz gerekiyor, bu yüzden uygulama sorunu giderir. Hiç normale dönerseniz, yani jailbreak'i kaldırırsanız, buraya basın.

Daha sonra kullanıcı etkileşimini işlersiniz ve farklı davranmak gibi uygun olanı yaparsınız ...


3

Cydia veya jailbreak cihazının oluşturduğu bir dosya bulmaya çalışın. Veya uygulamanın kara kutusunun dışındaki bir dosyaya yazmaya çalışın. Bunu yapmayı başarırsanız, cihazın güvenliği ihlal edilir / hapishane bozulur :)

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

2
Apple yukarıdaki kodu içeren uygulamanızı onayladı mı?
karthikPrabhu Alagu

3

Swift 4 ve üstü için lütfen aşağıdaki kodu kullanın: Appdelegate'e aşağıdaki kodu ekleyin:

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 (_ uygulama: 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()
            }
        }
    }
}

1

İşte benim çözümlerim: Adım 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
    }
}

2. Adım: viewDidLoad()Başlangıç ​​ekranı görüntüleme denetleyicinizin içinde (veya ilk kez aradığınız VC'nin içinde) arayın :

       // show a blank screen or some other view controller
       let viewController = UIDevice.current.isJailBroken() ? JailBrokenViewController() : NextViewController()
       self.navigationController?.present(viewController, animated: true, completion:nil)

-2

/Application/Preferences.app/General.plist'e Erişmeye Çalışın Jailbreak yapılmış bir iPhone'da bunu yapabilmelisiniz Jb olmayan telefonda, erişemezsiniz


3
Bu cevap kaynak kodu ile daha ilginç olurdu. IMHO: Bu size bir oy verecek.
Johan Karlsson

5
-1 = Unjailbroken aygıtları da bu dosyayı açabilir ve okuyabilir. (Test edildi)
frankish

@JohanKarlsson Buradaki okuyucuların kendi kaynak kodlarını yazabileceklerini varsayıyorum. Eğer yapamazlarsa - burada ne yapıyorlar?
gnasher729
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.