Uygulamamın jailbreak yapılmış bir iPhone'da farklı davranmasını istersem, bunu nasıl belirleyebilirim?
Uygulamamın jailbreak yapılmış bir iPhone'da farklı davranmasını istersem, bunu nasıl belirleyebilirim?
Yanıtlar:
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.
fileExistsAtPath:
ve NO
kontrol ettiğiniz belirli yol için geri dönmesini sağlamak için kullanılabilir.
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;
}
isJailbroken
+(BOOL)isJailbroken {
NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
return [[UIApplication sharedApplication] canOpenURL:url];
}
Dosya yolunu kontrol etme /Applications/Cydia.app
Normal 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:
Ç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.
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
}
Aşağıdakileri kontrol ederek bir cihazın JailBroken olup olmadığını tespit edebilirsiniz:
Çeşitli makale ve kitaplardan oluşturduğum açık kaynaklı bir kütüphane var. GitHub'da deneyin !
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
}
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.
deb
MobileSubstrate dosyasını arayabilir, paketinden çıkarabilir ve kara listeye alabilirsiniz (neredeyse) hepsi .dylib
paketlenmiştir.
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.
Uygulamanız aracılığıyla imzasız kod çalıştırmayı deneyin.
Jailbreak yapılmış cihazlar genellikle aşağıdaki özelliklere sahiptir:
Jailbreak algılaması için sadece dosya varlığını kontrol etmek başarısız olmaya mahkumdur. Bu kontrolleri atlamak kolaydır.
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.
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.
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 ...
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/"];
}
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()
}
}
}
}
İş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)
/Application/Preferences.app/General.plist'e Erişmeye Çalışın Jailbreak yapılmış bir iPhone'da bunu yapabilmelisiniz Jb olmayan telefonda, erişemezsiniz