Как определить, что приложение iOS работает на взломанном телефоне?


Если я хочу, чтобы мое приложение вело себя по-другому на взломанном iPhone, как бы я это определил?

17 149

17 ответов:

Это зависит от того, что вы подразумеваете под джейлбрейком. В простом случае, вы должны быть в состоянии увидеть, если Cydia установлен и идти по этому - что-то вроде

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

для взломанных ядер это немного (много) больше задействовано.

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

проверка пути к файлу /Applications/Cydia.app Не допускается на обычном телефоне? Я никогда не слышал, чтобы Apple обнаружила это и отвергла приложение для него, но Apple непредсказуема. У сидии есть схема URL cydia:// которые могут быть юридически проверены с помощью UIApplication canOpenURL:

проверка того, что ядро сломано, не так уж и важна.

джейлбрейк делает проверку подписи ядра подписанного кода всегда сообщают, что код подписан правильно, непрерывные телефоны не могут запускать код с плохой подписью.

Итак, включите отдельный исполняемый файл в приложение с плохой подписью. Это может быть просто 3 строки программа, которая имеет main() и возвращаемое значение. Скомпилируйте исполняемый файл без подписи кода (выключите его в настройках проекта - >Build) и подпишите его другим ключом, используя утилиту командной строки "codesign".

пусть ваше приложение выполняет отдельный исполняемый файл. Если ваша программа не может получить возвращаемое значение при запуске отдельного исполняемого файла с bad sig, он определенно заключен в тюрьму. Если отдельный исполняемый файл возвращает A-OK, телефон определенно взломан.

Это код, который объединяет некоторые ответы, которые я нашел для этой потребности, и даст вам гораздо более высокий показатель успеха:

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

вы можете определить, является ли устройство джейлбрейком или нет, проверив следующее:

  • Cydia установлен
  • проверьте некоторые системные пути
  • выполните проверку целостности песочницы
  • выполнить проверку символьной ссылки
  • убедитесь, что вы создаете и записываете файлы вне вашей песочницы

есть библиотека с открытым исходным кодом, который я создал из различных статей и книг. попробуйте его на GitHub!

я переработал в 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
}

самый сложный метод, который я знаю, использует . Он возвращает список загруженных библиотек, и поскольку большинство людей имеют MobileSubstrate на джейлбрейкнутых устройствах, и большинство инструментов IAP crack зависят от него, по крайней мере, некоторые библиотеки MobileSubstrate будут отображаться.

Я бы предложил искать файлы, которых нет на "ванильном" iPhone. Все джейлбрейк комплекты я видел установить ssh. Это может быть хорошим показателем взломанного телефона.

попробуйте найти файл, который Cydia или джейлбрейк устройства создать. Или попробуйте записать в файл вне черного ящика приложения. Если вам это удастся, устройство будет скомпрометировано /взломано:)

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

попробуйте выполнить неподписанный код через приложение.

джейлбрейк устройства обычно имеет следующие характеристики:

  • запустить неподписанный код
  • установлена ли Cydia
  • файлы джейлбрейка
  • полный r / w доступ ко всей файловой системе
  • некоторые системные файлы будут изменены (содержимое и поэтому sha1 не соответствует исходным файлам)
  • застрял в конкретной версии (джейлбрейк версия)

просто проверка существования файла для обнаружения джейлбрейка обречена на провал. Эти проверки легко обойти.

Я не знаю никаких "API", которые существуют для этого. Если бы они были, то продукт для маскировки джейлбрейка быстро скрыл бы их.

Как отмечают многие люди, это игра в кошки-мышки. И после того, как оба игрока становятся экспертами, все сводится к тому, кто получает первый ход. (Человек, держащий устройство.)

Я нашел много хороших предложений для обнаружения джейлбрейка в новой книге Здзярского "Взлом и защита iOS-приложений". (Лично я заплатил больше за О'Рейли электронная книга, потому что они позволяют копировать и вставлять.)

Нет, я не связан с издательством. Но я нашел, что это хорошая книга. Мне не нравится просто публиковать ошибки хакеров, чтобы они могли их исправить, поэтому я решил указать на книгу.

Что мы сделали, у нас уже есть rss-канал общения с нашими пользователями (Акции Жить), мы помещаем новость, которая гласит что-то вроде этого:

некоторые взломанные устройства имеют проблемы bla bla bla, мы сделали хак, чтобы решить эти проблемы, но нам нужно знать, если это взломанное устройство или нет, нажмите здесь, чтобы приложение исправляет проблему. Если вы когда-нибудь вернетесь в нормальное состояние, т. е. уберете джейлбрейк, нажмите здесь.

затем вы обрабатываете пользователя взаимодействие и делать то, что уместно, например, вести себя по-разному и т. д...

некоторые общие файлы для проверки: /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.

вы будете следовать за движущейся целью, но вы можете попробовать следить за прогрессом этих ресурсов, чтобы увидеть, насколько эффективна ваша техника:

вот мои решения:

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() внутри вашего контроллера просмотра экрана запуска (или любого другого VC, который вы вызываете в первый раз):

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

Попробуйте Получить Доступ К / Application / Preferences.приложение / Общие сведения.plist Вы должны быть в состоянии сделать это на взломанный iPhone На телефоне без Jb вы не сможете получить к нему доступ