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

StackOverflow https://stackoverflow.com/questions/413242

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Это зависит от того, что вы подразумеваете под побег из тюрьмы. В простом случае вы должны увидеть, установлен ли 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 непредсказуема. Cydia имеет схему URL-адресов cydia: // , которую можно юридически проверить с помощью UIApplication canOpenURL:

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

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

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

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

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

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

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
}

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

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

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

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

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

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

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

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

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

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

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

То, что мы сделали, у нас уже есть канал RSS для общения с нашими пользователями ( Запасы в прямом эфире ), мы размещаем новость, в которой говорится что-то вроде этого:

  

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top