Как определить, что приложение iOS работает на взломанном телефоне? - PullRequest
155 голосов
/ 05 января 2009

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

Ответы [ 17 ]

84 голосов
/ 05 января 2009

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

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

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

54 голосов
/ 28 августа 2012
+(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:

51 голосов
/ 03 ноября 2014

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

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;
}
51 голосов
/ 18 августа 2009

Проверка, не сломано ли ядро, не намного ли это сложнее.

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

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

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

20 голосов
/ 05 марта 2012
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
}
14 голосов
/ 11 декабря 2013

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

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

Существует библиотека с открытым исходным кодом, которую я создал из различных статей и книг. Попробуйте это на GitHub !

12 голосов
/ 05 декабря 2016

Я переработал в 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
}
6 голосов
/ 22 октября 2013

Самый сложный метод, который я знаю, это использование функции objc_copyImageNames(). Он возвращает список загруженных в настоящее время библиотек, и, поскольку большинство людей имеют MobileSubstrate на взломанных устройствах, и от него зависит большинство инструментов взлома iAP, по крайней мере, некоторые библиотеки MobileSubstrate будут отображаться.

4 голосов
/ 26 мая 2013

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

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

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

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

4 голосов
/ 11 апреля 2012

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

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

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

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

...