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.
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.