Если я хочу, чтобы мое приложение вел себя по-разному на взломанном iPhone, как бы я решил это определить?
Как определить, что приложение iOS работает на телефоне с джейлбрейком?
Ответ 1
Это зависит от того, что вы подразумеваете под джейлбрейком. В простом случае вы сможете увидеть, установлена ли Cydia и что происходит - что-то вроде
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
   // do something useful
}
Для взломанных ядер это немного (много) больше.
Ответ 2
+(BOOL)isJailbroken {
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
    return [[UIApplication sharedApplication] canOpenURL:url];
}
Проверка пути к файлу /Applications/Cydia.app не разрешена на обычном телефоне? Я никогда не слышал о том, что Apple обнаруживает это и отклоняет приложение для него, но Apple непредсказуема. Cydia имеет схему URL cydia://, которая может быть юридически проверена с помощью UIApplication canOpenURL:
Ответ 3
Этот код объединяет некоторые ответы, которые я нашел для этой цели, и даст вам гораздо более высокий уровень успеха:
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;
}
Ответ 4
Проверка того, что ядро сломано, не так много.
Jailbreaking делает проверку подписи ядра подписанным кодом, всегда сообщают, что код подписан правильно, несломанные телефоны не могут запускать код с плохой подписью.
Итак, включите отдельный исполняемый файл в приложение с плохой подписью. Это может быть только трехстрочная программа с основными() и возвращаемым значением. Скомпилируйте исполняемый файл без подписи кода (выключите его в Project Settings- > Build) и подпишите его другим ключом с помощью утилиты командной строки "codeign".
Попросите приложение выполнить отдельный исполняемый файл. Если ваша программа не может получить возвращаемое значение при запуске отдельного исполняемого файла с плохим sig, он определенно заключен в тюрьму. Если отдельный исполняемый файл возвращает A-OK, телефон определенно взломан.
Ответ 5
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
}
Ответ 6
Вы можете определить, является ли устройство JailBroken или нет, проверив следующее:
- Установлена Cydia
- Проверьте некоторые системные пути
- Выполнение проверки целостности песочницы
- Выполнение проверки символической ссылки
- Убедитесь, что вы создаете и записываете файлы вне своей песочницы
Существует библиотека с открытым исходным кодом, которую я создал из разных статей и книг. Попробуйте на GitHub!
Ответ 7
Я переработал в Swift 2.3 решение, предоставленное @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
}
Ответ 8
Самый сложный метод, который я знаю, использует функцию objc_copyImageNames(). Он возвращает список загружаемых в настоящее время библиотек, и поскольку большинство людей имеют MobileSubstrate на jailbroken-устройствах, и большинство инструментов для iAP-трека зависят от него, по крайней мере некоторые библиотеки MobileSubstrate будут отображаться.
Ответ 9
Мне не известны никакие "API", которые существуют для этого. Если бы это было так, то продукт маскировки с помощью джейлбрейка быстро скроил бы их.
Как отмечают многие люди, это игра "кошка-и-мышь". И после того, как оба игрока становятся экспертами, все сводится к тому, кто получает первый ход. (Лицо, держащее устройство.)
Я нашел много хороших предложений для обнаружения джейлбрейка в новой книге Zdziarski "Взлом и безопасность приложений iOS". (Лично я заплатил больше за книгу O'Reilly, потому что они разрешают копировать и вставлять.)
Нет, я не связан с издателями. Но я нашел хорошую книгу. Мне не нравится публиковать хакерские ошибки, чтобы они могли их исправить, поэтому я подумал, что хочу указать на книгу.
Ответ 10
Попробуйте выполнить неподписанный код через ваше приложение.
Устройства с джейлбрейком обычно имеют следующие характеристики:
- запустить неподписанный код
- установлен Cydia
- имеет файлы джейлбрейка
- полный доступ к полной файловой системе для всей файловой системы
- некоторые системные файлы будут изменены (содержимое и поэтому sha1 не соответствует оригинальным файлам)
- привязана к определенной версии (версия для геймплея)
Просто проверка существования файла для обнаружения джейлбрейка обречена на провал. Эти проверки легко обойти.
Ответ 11
Некоторые распространенные файлы для проверки:
/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
Большинство проверок для связанных файлов Cydia.
Ответ 12
Я предлагаю искать файлы, которых нет на iPhone "vanilla". Все комплекты jailbreak, которые я видел, устанавливают ssh. Это может быть хорошим показателем телефона с джейлбрейком.
Ответ 13
Что мы сделали, у нас уже есть канал RSS для связи с нашими пользователями (Акции Live), мы помещаем новость, которая заявляет что-то вроде этого:
Некоторые устройства с вредоносными программами имеют проблемы с bla bla bla, мы сделали взлом для решения этих проблем, но нам нужно знать, является ли это взломанным устройством или нет, нажмите здесь, чтобы приложение устранило проблему. Если вы когда-нибудь вернетесь к нормальной жизни, то есть удалите джейлбрейк, нажмите здесь.
Затем вы обрабатываете взаимодействие с пользователем и выполняете то, что подходит, например, ведете себя и т.д....
Ответ 14
Попробуйте найти файл, созданный cydia или jailbroken. Или попробуйте написать файл вне приложения blackbox. Если вам это удастся, устройство скомпрометировано /jailbroken:)
- (BOOL)jailbroken
{
    NSFileManager * fileManager = [NSFileManager defaultManager];
    return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
Ответ 15
Вы будете следить за движущейся мишенью, но вы можете попробовать следить за ходом этих ресурсов, чтобы узнать, насколько эффективна ваша техника:
Ответ 16
Вот мои решения:
extension UIDevice {
    func isJailBroken() -> Bool {
        var jailBroken = false
        let cydiaPath = "/Applications/Cydia.app"
        let aptPath = "/private/var/lib/apt/"
        if FileManager.default.fileExists(atPath: cydiaPath) {
            jailBroken = true
        }
        if FileManager.default.fileExists(atPath: aptPath) {
            jailBroken = true
        }
        return jailBroken
    }
}
и вызовите его внутри viewDidLoad() внутри контроллера представления экрана запуска (или любого другого виртуального канала, который вы вызываете в первый раз):
    if UIDevice.current.isJailBroken() {
       // show a blank screen or some other view controller
       let jailbreakVC = JailBrokenViewController()
       self.navigationController?.present(jailbreakVC, animated: true, completion:nil)
    } else {
     // continue executing your next View controller
     let nextVC = NextViewController()
     self.navigationController?.present(nextVC, animated: true, completion:nil)
    }
Ответ 17
Пожалуйста, используйте следующий код для Swift 4 и выше: Добавьте следующий код в 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()
            }
        }
    }
}
Ответ 18
Попробуйте получить доступ /Application/Preferences.app/General.plist Вы должны быть в состоянии сделать это на jailbroken iPhone На не-Jb-телефоне вы не сможете получить доступ к нему
