Como faço para detectar que um app iOS está sendo executado em um telefone jailbroken?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Se eu quero meu aplicativo para comportar de maneira diferente em um iPhone com jailbreak, como eu iria sobre como determinar isso?

Foi útil?

Solução

Depende do que você quer dizer com jailbreak. No caso simples, você deve ser capaz de ver se Cydia é instalado e ir por isso - algo como

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

Para kernels hackeados, que é um pouco (muito) mais envolvidos.

Outras dicas

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

Verificar o /Applications/Cydia.app caminho do arquivo não é permitido em um telefone normal? Eu nunca ouvi falar da Apple detectar isso e rejeitar um app para isso, mas a Apple é imprevisível. Cydia tem um Cydia esquema de URL: // que pode ser legalmente verificada com UIApplication canOpenURL:

Este é um código que combine algumas respostas que eu encontrei para esta necessidade, e lhe dará muito mais elevada taxa de sucesso:

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

Verificar se o kernel está quebrado que não é muito mais envolvido.

O jailbreak faz verificação de assinatura do kernel de código assinado sempre relatam que o código é assinado corretamente, telefones ininterrupta não pode executar código com uma má assinatura.

Assim, incluem um executável separado no aplicativo com um mau assinatura. Poderia ser apenas um programa 3-line que tem main () e um valor de retorno. Compilar o executável sem a assinatura de código (desligá-lo no Projeto Configurações> Construir) e assiná-lo com uma chave diferente usando o utilitário de linha de comando "codesign".

Tenha seu aplicativo exec o executável separado. Se o seu programa não pode obter o valor de retorno ao executar o executável separado com o mau sig, é definitivamente preso. Se o separado retornos executáveis ??A-OK, o telefone é definitivamente jailbroken.

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
}

Você pode detectar se um dispositivo é jailbroken ou não verificando o seguinte:

  • Cydia é instalado
  • Verifique alguns dos caminhos do sistema
  • Execute uma verificação de integridade sandbox
  • Execute symlink verificação
  • Verifique se você criar e arquivos de gravação fora da sua Sandbox

Não é uma fonte aberta biblioteca eu criei a partir de vários artigos e livros. Experimente-o sobre GitHub !

I refeito em Swift 2.3 a solução fornecida por @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
}

O método mais sofisticado que eu sei é usando a função objc_copyImageNames(). Ele retorna uma lista de bibliotecas carregadas no momento e desde que a maioria das pessoas têm MobileSubstrate em dispositivos desbloqueados e a maioria das ferramentas de crack IAP depender dele, pelo menos, algumas bibliotecas MobileSubstrate vai aparecer.

Eu não estou ciente de qualquer "APIs" que existem para isso. Se houvesse, em seguida, um produto de mascaramento de jailbreak rapidamente encobri-los.

Como muitas pessoas apontam, é um jogo de gato e rato. E depois de ambos os jogadores se tornar especialista, tudo se resume a quem recebe o primeiro movimento. (Pessoa segurando o aparelho.)

Eu encontrei muitas sugestões boas para a detecção de jailbreak no novo livro de Zdziarski "Hacking e Protegendo iOS Apps". (Pessoalmente, eu pago mais para a O'Reilly eBook porque permitem copiar e colar).

Não, eu não sou afiliado com os editores. Mas fez encontrar um bom livro. Eu não gosto de apenas publicar os erros dos hackers para que possam corrigi-los, então eu pensei que eu ia apontar para o livro.

Tente executar código não assinado através de sua aplicação.

dispositivos A jailbroken geralmente tem as seguintes características:

  • código não assinado executar
  • tem Cydia instalado
  • tem arquivos jailbreak
  • r completo / w acesso a todo o sistema de arquivos
  • alguns arquivos de sistema terá sido modificado (conteúdo e assim sha1 não coincide com os arquivos originais)
  • preso a versão específica (versão jailbreakable)

Apenas verificando a existência de arquivos para a detecção jailbreak está fadado ao fracasso. Essas verificações são fáceis de ignorar.

Alguns arquivos comuns a serem verificados: /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

A maioria cheque de arquivos relacionados Cydia.

Eu sugiro à procura de arquivos que não estão presentes em um "vanilla" iPhone. Todos os kits de jailbreak que eu vi instalar ssh. Isso pode ser um bom indicador de um telefone jailbroken.

O que fizemos é, nós já temos um feed RSS para se comunicar com nossos usuários ( estoques vivo ), colocamos uma notícia que os estados algo como isto:

Alguns dispositivos desbloqueados têm problemas bla bla bla, fizemos um hack para resolver essas questões, mas precisamos saber se este um dispositivo jailbroken ou não, pressione aqui para que as correções de aplicativos a questão. Se você alguma vez voltar ao normal, ou seja removido o jailbreak, pressione aqui.

Em seguida, você processar a interação do usuário e fazer o que é apropriado, como se comportar diferente etc ...

Tente encontrar um arquivo que Cydia ou dispositivo jailbroken criar. Ou tentar escrever em um arquivo fora blackbox do aplicativo. Se você conseguir fazer isso, o dispositivo é comprometida / jailbroken:)

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

Você vai estar a seguir um alvo em movimento, mas você pode tentar seguir o progresso desses recursos para ver como eficaz a sua técnica é a seguinte:

Heres meus soluções:

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

e chamá-lo dentro viewDidLoad() dentro de seu controlador de lançamento visualização da tela (ou qualquer VC que você está chamando pela primeira vez):

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

Tente acessar /Application/Preferences.app/General.plist Você deve ser capaz de fazê-lo em um iPhone com jailbreak Sobre a não Jb-telefone que você não será capaz de acessá-lo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top