2010-08-06 7 views
24

Possible Duplicate:
Determine if running on a rooted deviceDéterminer si un appareil Android est rooté par programmation?

Comment déterminez-vous (programme) si un appareil Android est: enraciné Exécution d'une copie fissurée de votre logiciel ou rom.

J'ai des informations sensibles dans ma base de données, et je voudrais les crypter lorsque le téléphone est rooté, c'est-à-dire que l'utilisateur a accès à la base de données. Comment puis-je détecter cela?

Répondre

26

La détection d'enracinement est un jeu de chat et de souris et il est difficile de faire une détection d'enracinement qui fonctionnera sur tous les appareils dans tous les cas.

Si vous avez encore besoin de base détection enracinant vérifier le code ci-dessous:

/** 
    * Checks if the device is rooted. 
    * 
    * @return <code>true</code> if the device is rooted, <code>false</code> otherwise. 
    */ 
    public static boolean isRooted() { 

    // get from build info 
    String buildTags = android.os.Build.TAGS; 
    if (buildTags != null && buildTags.contains("test-keys")) { 
     return true; 
    } 

    // check if /system/app/Superuser.apk is present 
    try { 
     File file = new File("/system/app/Superuser.apk"); 
     if (file.exists()) { 
     return true; 
     } 
    } catch (Exception e1) { 
     // ignore 
    } 

    // try executing commands 
    return canExecuteCommand("/system/xbin/which su") 
     || canExecuteCommand("/system/bin/which su") || canExecuteCommand("which su"); 
    } 

    // executes a command on the system 
    private static boolean canExecuteCommand(String command) { 
    boolean executedSuccesfully; 
    try { 
     Runtime.getRuntime().exec(command); 
     executedSuccesfully = true; 
    } catch (Exception e) { 
     executedSuccesfully = false; 
    } 

    return executedSuccesfully; 
    } 

Probablement pas toujours correct. Testé sur ~ 10 appareils en 2014.

+4

Vous voulez dire enraciné avec un outil spécifique qui ajoute Superuser.apk? Il n'existe pas de méthode programmatique garantie pour déterminer si un périphérique est root car la plupart des vérifications peuvent être contournées. – dljava

+1

J'ai utilisé cette vérification dans mon produit, mais récemment le Nexus 7.1 signale faux pour tous (aucune commande 'which' installée) et SuperSu n'installe pas dans le dossier/system/app. – Graeme

+0

Peut-être vous devriez également jeter un oeil à http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device –

1

Le official licensing guide dit:

A limitation of the legacy copy-protection mechanism on Android Market is that applications using it can be installed only on compatible devices that provide a secure internal storage environment. For example, a copy-protected application cannot be downloaded from Market to a device that provides root access, and the application cannot be installed to a device's SD card.

Il semble que vous bénéficieriez d'utiliser ce flic protection de l'héritage pour empêcher votre application d'être installée sur les appareils ancrés.

Vous pouvez publier une version distincte qui peut être installée sur des périphériques enracinés avec une base de données chiffrée.

+0

Mais comment peuvent-ils détecter si l'appareil est enraciné ou pas? Comme hackbod (développeur Android) mentionné, il n'est pas possible de détecter. http://stackoverflow.com/questions/3576989/how-can-you-detect-if-the-device-is-rooted-in-the-app –

5

Si l'information est sensible, vous devriez probablement le chiffrer pour tous les utilisateurs. Sinon, un utilisateur peut installer votre application sans rachat, puis root et lire votre base de données une fois que les données ont été écrites.

+0

Le problème est que si votre contenu est un contenu multimédia (mp3, mp4) , même crypté à l'origine, et vous voulez lire dans le lecteur multimédia, vous devez utiliser un fichier décrypté temporaire à un moment donné, qui pourrait être accessible sur un appareil enraciné. –

Questions connexes