Meine App verfügt über eine bestimmte Funktionalität, die nur auf einem Gerät funktioniert, auf dem root verfügbar ist. Anstatt diese Funktion bei Verwendung fehlschlagen zu lassen (und dem Benutzer dann eine entsprechende Fehlermeldung anzuzeigen), würde ich es vorziehen, stillschweigend zu prüfen, ob root zuerst verfügbar ist, und wenn nicht, die entsprechenden Optionen zunächst auszublenden .
Gibt es eine Möglichkeit, dies zu tun?
Antworten:
Hier ist eine Klasse, die auf drei Arten nach Root sucht.
quelle
su
Binärdatei enthalten, während sie nicht gerootet sind.Wenn Sie bereits Fabric / Firebase Crashlytics verwenden, können Sie anrufen
Dies ist die aktuelle Implementierung dieser Methode:
quelle
Die RootTools-Bibliothek bietet einfache Methoden zum Überprüfen auf root:
Referenz
quelle
In meiner Anwendung habe ich durch Ausführen des Befehls "su" überprüft, ob das Gerät gerootet ist oder nicht. Aber heute habe ich diesen Teil meines Codes entfernt. Warum?
Weil meine Anwendung zum Speicherkiller wurde. Wie? Lass mich dir meine Geschichte erzählen.
Es gab einige Beschwerden, dass meine Anwendung Geräte verlangsamte (natürlich dachte ich, dass das nicht wahr sein kann). Ich versuchte herauszufinden warum. Also habe ich MAT verwendet, um Heap-Dumps zu erhalten und zu analysieren, und alles schien perfekt zu sein. Aber nachdem ich meine App viele Male neu gestartet hatte, stellte ich fest, dass das Gerät wirklich langsamer wird und das Stoppen meiner Anwendung es nicht schneller machte (es sei denn, ich starte das Gerät neu). Ich habe die Dump-Dateien erneut analysiert, während das Gerät sehr langsam ist. Aber alles war immer noch perfekt für Dump-Dateien. Dann habe ich getan, was zuerst getan werden muss. Ich habe Prozesse aufgelistet.
Überraschen; Es gab viele Prozesse für meine Anwendung (mit dem Prozess-Tag meiner Anwendung im Manifest). Einige von ihnen waren Zombies, andere nicht.
Bei einer Beispielanwendung mit einer einzelnen Aktivität, die nur den Befehl "su" ausführt, wurde mir klar, dass bei jedem Start der Anwendung ein Zombie-Prozess erstellt wird. Zuerst weisen diese Zombies 0 KB zu, aber dann passiert etwas und Zombie-Prozesse enthalten fast die gleichen KBs wie der Hauptprozess meiner Anwendung, und sie wurden zu Standardprozessen.
Auf bugs.sun.com gibt es einen Fehlerbericht für dasselbe Problem: http://bugs.sun.com/view_bug.do?bug_id=6474073 Dies erklärt, wenn kein Befehl gefunden wird. Zombies werden mit der exec () -Methode erstellt . Aber ich verstehe immer noch nicht, warum und wie sie zu Standardprozessen werden und wichtige KBs enthalten können. (Dies passiert nicht immer)
Sie können versuchen, wenn Sie mit dem folgenden Codebeispiel möchten.
Einfache Befehlsausführungsmethode;
Um zusammenzufassen; Ich habe keinen Rat für Sie, um festzustellen, ob das Gerät gerootet ist oder nicht. Aber wenn ich Sie wäre, würde ich Runtime.getRuntime (). Exec () nicht verwenden.
Apropos; RootTools.isRootAvailable () verursacht dasselbe Problem.
quelle
Viele der hier aufgeführten Antworten haben inhärente Probleme:
Die RootTools- Bibliothek von Stericson scheint legitimer nach Root zu suchen. Es hat auch viele zusätzliche Tools und Dienstprogramme, daher kann ich es nur empfehlen. Es gibt jedoch keine Erklärung dafür, wie speziell nach Root gesucht wird, und es ist möglicherweise etwas schwerer als die meisten Apps wirklich benötigen.
Ich habe einige Dienstprogrammmethoden erstellt, die lose auf der RootTools-Bibliothek basieren. Wenn Sie einfach überprüfen möchten, ob sich die ausführbare Datei "su" auf dem Gerät befindet, können Sie die folgende Methode verwenden:
Diese Methode durchläuft einfach die in der Umgebungsvariablen "PATH" aufgeführten Verzeichnisse und prüft, ob in einer von ihnen eine "su" -Datei vorhanden ist.
Um wirklich nach Root-Zugriff zu suchen, muss der Befehl "su" tatsächlich ausgeführt werden. Wenn eine App wie SuperUser installiert ist, fordert sie an dieser Stelle möglicherweise den Root-Zugriff an, oder wenn ihr bereits gewährt / verweigert wurde, wird möglicherweise ein Toast angezeigt, der angibt, ob der Zugriff gewährt / verweigert wurde. Ein guter Befehl zum Ausführen ist "id", damit Sie überprüfen können, ob die Benutzer-ID tatsächlich 0 (root) ist.
Hier ist eine Beispielmethode, um festzustellen, ob Root-Zugriff gewährt wurde:
Es ist wichtig, die Ausführung des Befehls "su" tatsächlich zu testen, da in einigen Emulatoren die ausführbare Datei "su" vorinstalliert ist, aber nur bestimmten Benutzern wie der adb-Shell der Zugriff darauf gestattet ist.
Es ist auch wichtig, die Existenz der ausführbaren Datei "su" zu überprüfen, bevor Sie versuchen, sie auszuführen, da bekannt ist, dass Android Prozesse, die versuchen, fehlende Befehle auszuführen, nicht ordnungsgemäß entsorgt. Diese Geisterprozesse können den Speicherverbrauch im Laufe der Zeit erhöhen.
quelle
Update 2017
Sie können dies jetzt mit der Google Safetynet-API tun . Die SafetyNet-API bietet eine Attestierungs-API, mit der Sie die Sicherheit und Kompatibilität der Android-Umgebungen bewerten können, in denen Ihre Apps ausgeführt werden.
Diese Bescheinigung kann dazu beitragen, festzustellen, ob das jeweilige Gerät manipuliert oder anderweitig geändert wurde.
Die Attestation-API gibt eine solche JWS-Antwort zurück
Durch Analysieren dieser Antwort können Sie feststellen, ob das Gerät gerootet ist oder nicht
Sie können dies auf der Clientseite tun, es wird jedoch empfohlen, die Antwort auf der Serverseite zu analysieren. Eine grundlegende Client-Server-Architektur mit Sicherheitsnetz-API sieht folgendermaßen aus:
quelle
Root Check auf Java-Ebene ist keine sichere Lösung. Wenn Ihre App Sicherheitsbedenken hat, die auf einem gerooteten Gerät ausgeführt werden sollen, verwenden Sie diese Lösung.
Kevins Antwort funktioniert nur, wenn das Telefon auch eine App wie RootCloak hat. Solche Apps haben eine Handle-over-Java-API, sobald das Telefon gerootet ist, und sie verspotten diese APIs, um zurückzugeben, dass das Telefon nicht gerootet ist.
Ich habe einen Code auf nativer Ebene geschrieben, der auf Kevins Antwort basiert. Er funktioniert sogar mit RootCloak! Außerdem verursacht es keine Speicherverlustprobleme.
In Ihrem Java-Code müssen Sie die Wrapper-Klasse RootUtils erstellen, um die nativen Aufrufe durchzuführen
quelle
http://code.google.com/p/roottools/
Wenn Sie die JAR-Datei nicht verwenden möchten, verwenden Sie einfach den folgenden Code:
Das Programm versucht, den Ordner su zu finden:
Beispiel:
quelle
checkRootMethod4()
bei Kevins Antwort .== true
einen Booleschen Wert hinzu, er fügt nichts hinzu und sieht nicht gut aus.if (isRooted())
überprüfen Sie, anstatt explizit true zu schreiben. Es ist besser, Code-Schreibmuster zu folgenAnstelle von isRootAvailable () können Sie isAccessGiven () verwenden. Direkt aus dem RootTools- Wiki :
Referenz
quelle
Einige modifizierte Builds, mit denen die Systemeigenschaft
ro.modversion
für diesen Zweck festgelegt wurde. Die Dinge scheinen sich weiterentwickelt zu haben; Mein Build von TheDude vor ein paar Monaten hat folgendes:Der Emulator aus dem 1.5 SDK, auf dem das 1.5 Image ausgeführt wird, hat ebenfalls root, ähnelt wahrscheinlich dem Android Dev Phone 1 (das Sie vermutlich zulassen möchten) und hat Folgendes:
Was die Einzelhandelsbauten betrifft, habe ich keine zur Hand, aber verschiedene Suchanfragen unter
site:xda-developers.com
sind informativ. Hier ist ein G1 in den Niederlanden , Sie können sehen, dassro.build.tags
dies nicht der Fall isttest-keys
, und ich denke, dass dies wahrscheinlich die zuverlässigste Eigenschaft ist, die verwendet werden kann.quelle
RootBeer ist eine Root-Checking-Android-Bibliothek von Scott und Matthew. Es werden verschiedene Überprüfungen verwendet, um anzuzeigen, ob das Gerät gerootet ist oder nicht.
quelle
Ich schlage vor, nativen Code für die Stammerkennung zu verwenden. Hier ist ein voll funktionsfähiges Beispiel .
JAVA-Wrapper :
JNI-Wrapper (native-lib.c) :
Konstanten:
Root-Erkennungen aus nativem Code:
quelle
Hier ist mein Code basierend auf einigen Antworten hier:
quelle
Neben der Antwort von @ Kevin habe ich kürzlich bei der Verwendung seines Systems festgestellt, dass das Nexus 7.1
false
für alle drei Methoden zurückgegeben wurde - Keinwhich
Befehl, neintest-keys
undSuperSU
nicht installiert/system/app
.Ich habe folgendes hinzugefügt:
Dies ist in einigen Situationen etwas weniger nützlich (wenn Sie einen garantierten Root-Zugriff benötigen), da SuperSU möglicherweise auf Geräten installiert werden kann, die keinen SU-Zugriff haben.
Da es jedoch möglich ist, SuperSU installiert zu haben und zu funktionieren, jedoch nicht im
/system/app
Verzeichnis, werden in diesem zusätzlichen Fall solche Fälle verwurzelt (haha).quelle
quelle
Zwei zusätzliche Ideen, wenn Sie überprüfen möchten, ob ein Gerät über Ihre App root-fähig ist:
Runtime.getRuntime().exec()
/system/app/Superuser.apk
Lagequelle
Die Verwendung von C ++ mit dem ndk ist der beste Ansatz, um root zu erkennen, selbst wenn der Benutzer Anwendungen verwendet, die sein root verbergen, wie z. B. RootCloak. Ich habe diesen Code mit RootCloak getestet und konnte den Root erkennen, auch wenn der Benutzer versucht, ihn auszublenden. Ihre CPP-Datei möchte also:
Und Sie werden die Funktion aus Ihrem Java-Code wie folgt aufrufen
quelle
quelle
Es gibt die Safety Net Attestation API von Google Play Services, mit der wir das Gerät bewerten und feststellen können, ob es gerootet / manipuliert ist.
Bitte gehen Sie meine Antwort durch, um sich mit gerooteten Geräten zu befassen:
https://stackoverflow.com/a/58304556/3908895
quelle
Vergessen Sie all das Erkennen von Root-Apps und su-Binärdateien. Überprüfen Sie den Root-Daemon-Prozess. Dies kann vom Terminal aus erfolgen und Sie können Terminalbefehle innerhalb einer App ausführen. Probieren Sie diesen Einzeiler.
Sie benötigen auch keine Root-Berechtigung, um dies zu erreichen.
quelle
In der Tat ist es eine interessante Frage und bisher hat niemand eine Auszeichnung verdient. Ich benutze den folgenden Code:
Der Code ist sicherlich nicht kugelsicher, da das Netzwerk möglicherweise nicht verfügbar ist und Sie eine Ausnahme erhalten. Wenn diese Methode true zurückgibt, können Sie sicher sein, 99%, andernfalls nur 50%. Eine Netzwerkberechtigung kann die Lösung ebenfalls beeinträchtigen.
quelle
Mit meiner Bibliothek bei rootbox ist das ziemlich einfach. Überprüfen Sie den erforderlichen Code unten:
quelle