iOS Cihazın Jailbreak Olup Olmadığının Yazılımsal Tesbiti

Bazı durumlarda iOS uygulamalarının Jailbreak yapılmış cihazlarda çalışmasının riskleri bulunmaktadır. Özellikle medya uyumlu veya banka uygulamalarında jailbreak bazı riskleri getirmektedir. Sizde uygulamanızın jailbreak yapılmış olan cihazda çalışmaması veya sınırlı çalışması için aşağıdaki örnek kodları kullanabilirsiniz.

Unutmayın ki jailbreak geliştiricileri veya destekçileri uygulamaların jailbreak tesbit etme durumlarını da pasifize edecek yöntemler sunmaktadırlar. Dolayısıyla aşağıdaki yöntemler genel yöntemler olup tedarikli jailbreak kullanıcılarında %100 doğru sonuç beklemek yanlış olur.

Jailbreak tesbiti yaptıktan sonra aşağıdakine benzer bir uyarı ve gerekli işlemi yaptırabilirsiniz.

cepbankjb

Aşağıdaki kodlar Objective C ile yazılmıştır ve çeşitli farklı yöntemler içermektedir. Birden fazla kontrolü aynı anda yaptırmak faydalı olabilir.

Yöntem 1: Sembolik Linklerin vaslığının tespit edilmesi

Jailbreak işlemi birden fazla önemli iOS dosya sistemi klasörlerinin farklı konumlara taşıma işlemini içerir. Bu durumda dosyaların orijinal yerlerinde yeni yerlerine ait sembolik linkler oluşturulur (Linux mantığı). Bu durumda bu sembolik klasör veya dosya linklerini tespit edersek cihazın jailbreak edilmiş olduğunu anlayabiliriz.

#import <sys/stat.h>

void checkJailbreakSymlinks()
{
    NSArray *linksChecks = @[LOO_CRYPT_STR_N("/Applications", 13),
                             LOO_CRYPT_STR_N("/usr/libexec", 12),
                             LOO_CRYPT_STR_N("/usr/share", 10),
                             LOO_CRYPT_STR_N("/Library/Wallpaper", 18),
                             LOO_CRYPT_STR_N("/usr/include", 12)];
    
    for (NSString *checkPath in linksChecks)
    {
        checkJailbreakSymLink(checkPath);
    }
}

void checkJailbreakSymLink(NSString *checkPath)
{
    struct stat s;
    
    if (lstat([checkPath UTF8String], &s) == 0)
    {
        if (S_ISLNK(s.st_mode) == 1)
        {
            foundJailbrokenDevice();  // jailbreak tesbit edildiğinde çalıştırılacak fonksiyon
        }
    }
}

Yöntem 2: Jailbreak cihazlar için ortak olan dosyaları bulma

Bir başka yöntem ise jailbreak yapılmış cihazlarda bulunan Cydia.app veya MobileSubstrate.dylib gibi genel uygulamaların varlığını araştırmak olacaktır.

void checkJailbreakFiles()
{
    NSArray *fileChecks = @[LOO_CRYPT_STR_N("/bin/bash", 9),
                            LOO_CRYPT_STR_N("/etc/apt", 8),
                            LOO_CRYPT_STR_N("/usr/sbin/sshd", 14),
                            LOO_CRYPT_STR_N("/Library/MobileSubstrate/MobileSubstrate.dylib", 46),
                            LOO_CRYPT_STR_N("/Applications/Cydia.app", 23),
                            LOO_CRYPT_STR_N("/bin/sh", 7),
                            LOO_CRYPT_STR_N("/var/cache/apt", 14),
                            LOO_CRYPT_STR_N("/var/tmp/cydia.log", 18)];
    
    for (NSString *checkPath in fileChecks)
    {
        checkJailbreakFile(checkPath);
    }
}

void checkJailbreakFile(NSString *checkPath)
{
    struct stat s;
    
    if (stat([checkPath UTF8String], &s) == 0)
    {
        foundJailbrokenDevice(); // jailbreak tesbit edildiğinde çalıştırılacak fonksiyon
    }
}

Yöntem 3: Sistem dosya alanına yazma/okuma işlemi yapmaya çalışmak (sandbox violation)

Jailbreak yapılmamış cihazlarda uygulamalar sadece kendine ayrılmış uygulama havuz (sandbox) alanında yetkiye sahiptir. Eğer bir uygulama kendine ait uygulama havuzu dışındaki yerlere ulaşabiliyorsa bu cihazın jailbreak yapılmış olduğu anlamına gelecektir.

void checkReadWritePermissions()
{
    if([[UIApplication sharedApplication] canOpenURL:
        [NSURL URLWithString:LOO_CRYPT_STR_N("cydia://package/com.com.com", 27)]])
    {
        foundJailbrokenDevice();
    }
    
    NSError *error;
    NSString *stringToBeWritten = @"0";
    [stringToBeWritten writeToFile:LOO_CRYPT_STR_N("/private/jailbreak.test", 23)
                        atomically:YES
                          encoding:NSUTF8StringEncoding error:&error];
    if (error == nil)
    {
        foundJailbrokenDevice(); // jailbreak tesbit edildiğinde çalıştırılacak fonksiyon
    }
}

Şunu da unutmayın ki, standart şekilde yukarıdaki jailbreak tesbit kodlarını uygulamanıza eklediğinizde jailbreak ustaları tarafından bunun kolayca uygulama kodlarından çıkartılabileceğini unutmayın. Yani yukarıdaki kodları öyle bir gizlemelisiniz ki jailbreak ustaları bunu tespit edemesin.

Örnek bir Xcode projesi şeklinde bir uygulama isterseniz buraya veya buraya tıklayıp ulaşabilirsiniz.